alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
44 lines (37 loc) • 1.23 kB
text/typescript
import { $inject } from "../primitives/$inject.ts";
import { Json } from "./Json.ts";
import { SchemaCodec } from "./SchemaCodec.ts";
import type { Static, TSchema } from "./TypeProvider.ts";
export class JsonSchemaCodec extends SchemaCodec {
protected readonly json = $inject(Json);
protected readonly encoder = new TextEncoder();
protected readonly decoder = new TextDecoder();
public encodeToString<T extends TSchema>(
schema: T,
value: Static<T>,
): string {
return this.json.stringify(value);
}
public encodeToBinary<T extends TSchema>(
schema: T,
value: Static<T>,
): Uint8Array {
return this.encoder.encode(this.encodeToString(schema, value));
}
public decode<T>(schema: TSchema, value: unknown): T {
if (value instanceof Uint8Array) {
const text = this.decoder.decode(value);
return this.json.parse(text);
}
if (typeof value === "string") {
// Only parse if it looks like JSON (starts with { or [)
const trimmed = value.trim();
if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
return this.json.parse(value);
}
// Return plain strings as-is
return value as T;
}
return value as T;
}
}