function camelCase(input: string) { return input
.replace(/[^a-zA-Z0-9]+/g, " ")
.trim()
.toLowerCase()
.split(/\s+/)
.map((p, i) => (i === 0 ? p : p[0].toUpperCase() + p.slice(1)))
.join("");
}
function safeName(name: string) { const cc = camelCase(name.replace(/-/g, "_")); if (reserved.has(cc)) { return `_${cc}`;
} return cc;
}
// filled later once schemas are loaded const schemaNameByObject = new Map<object, string>(); const schemaNameBySignature = new Map<string, string>(); const duplicateSchemaSignatures = new Set<string>();
function stableJson(value: unknown): unknown { if (Array.isArray(value)) { return value.map(stableJson);
} if (value && typeof value === "object") { const record = value as Record<string, unknown>; return Object.fromEntries(
Object.keys(record)
.toSorted()
.map((key) => [key, stableJson(record[key])]),
);
} return value;
}
function schemaSignature(schema: JsonSchema): string { return JSON.stringify(stableJson(schema));
}
function registerNamedSchema(name: string, schema: JsonSchema): void {
schemaNameByObject.set(schema as object, name); const signature = schemaSignature(schema); if (duplicateSchemaSignatures.has(signature)) { return;
} if (schemaNameBySignature.has(signature)) {
schemaNameBySignature.delete(signature);
duplicateSchemaSignatures.add(signature); return;
}
schemaNameBySignature.set(signature, name);
}
public init(from decoder: Decoder) throws {
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
let type = try typeContainer.decode(String.self, forKey: .type) switch type { case"req":
self = try .req(RequestFrame(from: decoder)) case"res":
self = try .res(ResponseFrame(from: decoder)) case"event":
self = try .event(EventFrame(from: decoder)) default:
let container = try decoder.singleValueContainer()
let raw = try container.decode([String: AnyCodable].self)
self = .unknown(type: type, raw: raw)
}
}
public func encode(to encoder: Encoder) throws { switch self { case let .req(v): try v.encode(to: encoder) case let .res(v): try v.encode(to: encoder) case let .event(v): try v.encode(to: encoder) case let .unknown(_, raw): var container = encoder.singleValueContainer() try container.encode(raw)
}
}
`;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.