41 lines
1.5 KiB
Plaintext
41 lines
1.5 KiB
Plaintext
import { TransformKind } from '../symbols/index.mjs';
|
|
// ------------------------------------------------------------------
|
|
// TypeGuard
|
|
// ------------------------------------------------------------------
|
|
import { IsTransform } from '../guard/kind.mjs';
|
|
// ------------------------------------------------------------------
|
|
// TransformBuilders
|
|
// ------------------------------------------------------------------
|
|
export class TransformDecodeBuilder {
|
|
constructor(schema) {
|
|
this.schema = schema;
|
|
}
|
|
Decode(decode) {
|
|
return new TransformEncodeBuilder(this.schema, decode);
|
|
}
|
|
}
|
|
// prettier-ignore
|
|
export class TransformEncodeBuilder {
|
|
constructor(schema, decode) {
|
|
this.schema = schema;
|
|
this.decode = decode;
|
|
}
|
|
EncodeTransform(encode, schema) {
|
|
const Encode = (value) => schema[TransformKind].Encode(encode(value));
|
|
const Decode = (value) => this.decode(schema[TransformKind].Decode(value));
|
|
const Codec = { Encode: Encode, Decode: Decode };
|
|
return { ...schema, [TransformKind]: Codec };
|
|
}
|
|
EncodeSchema(encode, schema) {
|
|
const Codec = { Decode: this.decode, Encode: encode };
|
|
return { ...schema, [TransformKind]: Codec };
|
|
}
|
|
Encode(encode) {
|
|
return (IsTransform(this.schema) ? this.EncodeTransform(encode, this.schema) : this.EncodeSchema(encode, this.schema));
|
|
}
|
|
}
|
|
/** `[Json]` Creates a Transform type */
|
|
export function Transform(schema) {
|
|
return new TransformDecodeBuilder(schema);
|
|
}
|