Skip to content

Commit 0f89bf7

Browse files
Copilotstreamich
andcommitted
feat: refactor codegen methods to use centralized routers
Co-authored-by: streamich <[email protected]>
1 parent 49b5831 commit 0f89bf7

File tree

7 files changed

+50
-131
lines changed

7 files changed

+50
-131
lines changed

src/codegen/binary/cborEncoders.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ const codegenBinaryEncoder = (ctx: BinaryEncoderCodegenContext<BinaryJsonEncoder
4141
break;
4242
}
4343
case 'bool': {
44-
ctx.js(/* js */ `encoder.writeBool(${v});`);
44+
ctx.js(/* js */ `encoder.writeBoolean(${v});`);
4545
break;
4646
}
4747
default: {
@@ -108,7 +108,7 @@ export const arr = (
108108
const rl = codegen.getRegister(); // array.length
109109
const ri = codegen.getRegister(); // index
110110
ctx.js(/* js */ `var ${r} = ${value.use()}, ${rl} = ${r}.length, ${ri} = 0;`);
111-
ctx.js(/* js */ `encoder.writeArrayHead(${rl});`);
111+
ctx.js(/* js */ `encoder.writeArrHdr(${rl});`);
112112
ctx.js(/* js */ `for(; ${ri} < ${rl}; ${ri}++) ` + '{');
113113
encodeFn(ctx, new JsExpression(() => `${r}[${ri}]`), arrType.type);
114114
ctx.js(`}`);
@@ -124,7 +124,7 @@ export const tup = (
124124
const codegen = ctx.codegen;
125125
const r = codegen.var(value.use());
126126
const types = tupType.types;
127-
ctx.js(/* js */ `encoder.writeArrayHead(${types.length});`);
127+
ctx.js(/* js */ `encoder.writeArrHdr(${types.length});`);
128128
for (let i = 0; i < types.length; i++) {
129129
encodeFn(ctx, new JsExpression(() => `${r}[${i}]`), types[i]);
130130
}
@@ -152,7 +152,7 @@ export const obj = (
152152

153153
if (optionalFields.length === 0) {
154154
// All fields are required
155-
ctx.js(/* js */ `encoder.writeObjectHead(${fields.length});`);
155+
ctx.js(/* js */ `encoder.writeObjHdr(${fields.length});`);
156156
for (const field of fields) {
157157
const key = field.key;
158158
const accessor = normalizeAccessor(key);
@@ -171,7 +171,7 @@ export const obj = (
171171
ctx.js(/* js */ `if (${r}${accessor} !== undefined) ${rSize}++;`);
172172
}
173173

174-
ctx.js(/* js */ `encoder.writeObjectHead(${rSize});`);
174+
ctx.js(/* js */ `encoder.writeObjHdr(${rSize});`);
175175

176176
// Encode required fields
177177
for (const field of requiredFields) {
@@ -208,7 +208,7 @@ export const map = (
208208
const ri = codegen.var('0');
209209

210210
ctx.js(/* js */ `var ${rKeys} = Object.keys(${r}), ${rLen} = ${rKeys}.length, ${rKey}, ${ri} = 0;`);
211-
ctx.js(/* js */ `encoder.writeObjectHead(${rLen});`);
211+
ctx.js(/* js */ `encoder.writeObjHdr(${rLen});`);
212212
ctx.js(/* js */ `for (; ${ri} < ${rLen}; ${ri}++) {`);
213213
ctx.js(/* js */ `${rKey} = ${rKeys}[${ri}];`);
214214
ctx.js(/* js */ `encoder.writeStr(${rKey});`);

src/codegen/binary/jsonEncoders.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ const codegenBinaryEncoder = (ctx: BinaryEncoderCodegenContext<BinaryJsonEncoder
4141
break;
4242
}
4343
case 'bool': {
44-
ctx.js(/* js */ `encoder.writeBool(${v});`);
44+
ctx.js(/* js */ `encoder.writeBoolean(${v});`);
4545
break;
4646
}
4747
default: {
@@ -108,7 +108,7 @@ export const arr = (
108108
const rl = codegen.getRegister(); // array.length
109109
const ri = codegen.getRegister(); // index
110110
ctx.js(/* js */ `var ${r} = ${value.use()}, ${rl} = ${r}.length, ${ri} = 0;`);
111-
ctx.js(/* js */ `encoder.writeArrayHead(${rl});`);
111+
ctx.js(/* js */ `encoder.writeArrHdr(${rl});`);
112112
ctx.js(/* js */ `for(; ${ri} < ${rl}; ${ri}++) ` + '{');
113113
encodeFn(ctx, new JsExpression(() => `${r}[${ri}]`), arrType.type);
114114
ctx.js(`}`);
@@ -124,7 +124,7 @@ export const tup = (
124124
const codegen = ctx.codegen;
125125
const r = codegen.var(value.use());
126126
const types = tupType.types;
127-
ctx.js(/* js */ `encoder.writeArrayHead(${types.length});`);
127+
ctx.js(/* js */ `encoder.writeArrHdr(${types.length});`);
128128
for (let i = 0; i < types.length; i++) {
129129
encodeFn(ctx, new JsExpression(() => `${r}[${i}]`), types[i]);
130130
}
@@ -152,7 +152,7 @@ export const obj = (
152152

153153
if (optionalFields.length === 0) {
154154
// All fields are required
155-
ctx.js(/* js */ `encoder.writeObjectHead(${fields.length});`);
155+
ctx.js(/* js */ `encoder.writeObjHdr(${fields.length});`);
156156
for (const field of fields) {
157157
const key = field.key;
158158
const accessor = normalizeAccessor(key);
@@ -171,7 +171,7 @@ export const obj = (
171171
ctx.js(/* js */ `if (${r}${accessor} !== undefined) ${rSize}++;`);
172172
}
173173

174-
ctx.js(/* js */ `encoder.writeObjectHead(${rSize});`);
174+
ctx.js(/* js */ `encoder.writeObjHdr(${rSize});`);
175175

176176
// Encode required fields
177177
for (const field of requiredFields) {
@@ -208,7 +208,7 @@ export const map = (
208208
const ri = codegen.var('0');
209209

210210
ctx.js(/* js */ `var ${rKeys} = Object.keys(${r}), ${rLen} = ${rKeys}.length, ${rKey}, ${ri} = 0;`);
211-
ctx.js(/* js */ `encoder.writeObjectHead(${rLen});`);
211+
ctx.js(/* js */ `encoder.writeObjHdr(${rLen});`);
212212
ctx.js(/* js */ `for (; ${ri} < ${rLen}; ${ri}++) {`);
213213
ctx.js(/* js */ `${rKey} = ${rKeys}[${ri}];`);
214214
ctx.js(/* js */ `encoder.writeStr(${rKey});`);

src/codegen/binary/messagePackEncoders.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ const codegenBinaryEncoder = (ctx: BinaryEncoderCodegenContext<BinaryJsonEncoder
4141
break;
4242
}
4343
case 'bool': {
44-
ctx.js(/* js */ `encoder.writeBool(${v});`);
44+
ctx.js(/* js */ `encoder.writeBoolean(${v});`);
4545
break;
4646
}
4747
default: {
@@ -108,7 +108,7 @@ export const arr = (
108108
const rl = codegen.getRegister(); // array.length
109109
const ri = codegen.getRegister(); // index
110110
ctx.js(/* js */ `var ${r} = ${value.use()}, ${rl} = ${r}.length, ${ri} = 0;`);
111-
ctx.js(/* js */ `encoder.writeArrayHead(${rl});`);
111+
ctx.js(/* js */ `encoder.writeArrHdr(${rl});`);
112112
ctx.js(/* js */ `for(; ${ri} < ${rl}; ${ri}++) ` + '{');
113113
encodeFn(ctx, new JsExpression(() => `${r}[${ri}]`), arrType.type);
114114
ctx.js(`}`);
@@ -124,7 +124,7 @@ export const tup = (
124124
const codegen = ctx.codegen;
125125
const r = codegen.var(value.use());
126126
const types = tupType.types;
127-
ctx.js(/* js */ `encoder.writeArrayHead(${types.length});`);
127+
ctx.js(/* js */ `encoder.writeArrHdr(${types.length});`);
128128
for (let i = 0; i < types.length; i++) {
129129
encodeFn(ctx, new JsExpression(() => `${r}[${i}]`), types[i]);
130130
}
@@ -152,7 +152,7 @@ export const obj = (
152152

153153
if (optionalFields.length === 0) {
154154
// All fields are required
155-
ctx.js(/* js */ `encoder.writeObjectHead(${fields.length});`);
155+
ctx.js(/* js */ `encoder.writeObjHdr(${fields.length});`);
156156
for (const field of fields) {
157157
const key = field.key;
158158
const accessor = normalizeAccessor(key);
@@ -171,7 +171,7 @@ export const obj = (
171171
ctx.js(/* js */ `if (${r}${accessor} !== undefined) ${rSize}++;`);
172172
}
173173

174-
ctx.js(/* js */ `encoder.writeObjectHead(${rSize});`);
174+
ctx.js(/* js */ `encoder.writeObjHdr(${rSize});`);
175175

176176
// Encode required fields
177177
for (const field of requiredFields) {
@@ -208,7 +208,7 @@ export const map = (
208208
const ri = codegen.var('0');
209209

210210
ctx.js(/* js */ `var ${rKeys} = Object.keys(${r}), ${rLen} = ${rKeys}.length, ${rKey}, ${ri} = 0;`);
211-
ctx.js(/* js */ `encoder.writeObjectHead(${rLen});`);
211+
ctx.js(/* js */ `encoder.writeObjHdr(${rLen});`);
212212
ctx.js(/* js */ `for (; ${ri} < ${rLen}; ${ri}++) {`);
213213
ctx.js(/* js */ `${rKey} = ${rKeys}[${ri}];`);
214214
ctx.js(/* js */ `encoder.writeStr(${rKey});`);

src/codegen/validator/validators.ts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export const any = (ctx: ValidatorCodegenContext, path: ValidationPath, r: strin
1515
const rt = codegen.getRegister();
1616
ctx.js(/* js */ `var ${rv} = ${r}, ${rt} = ${rv} instanceof Value ? ${rv}.type : null;`);
1717
ctx.js(/* js */ `if (${rt}) {`);
18-
ctx.js(/* js */ `var res = ${rt}.validator(${JSON.stringify(ctx.errors)})(${rv}.data);`);
18+
ctx.js(/* js */ `var res = ${rt}.validator(${JSON.stringify(ctx.options.errors)})(${rv}.data);`);
1919
ctx.js(/* js */ `if (res) return res;`);
2020
ctx.js(/* js */ `}`);
2121
ctx.emitCustomValidators(type, path, r);
@@ -34,45 +34,45 @@ export const num = (ctx: ValidatorCodegenContext, path: ValidationPath, r: strin
3434
ctx.js(/* js */ `if(typeof ${r} !== "number") return ${error};`);
3535

3636
if (int || format) {
37-
const intErr = ctx.err(ValidationError.NUM_INT, path);
37+
const intErr = ctx.err(ValidationError.INT, path);
3838
ctx.js(/* js */ `if(${r} !== (${r} | 0)) return ${intErr};`);
3939
}
4040

4141
if (typeof gte === 'number') {
42-
const err = ctx.err(ValidationError.NUM_MIN, path);
42+
const err = ctx.err(ValidationError.GTE, path);
4343
ctx.js(/* js */ `if(${r} < ${gte}) return ${err};`);
4444
}
4545
if (typeof gt === 'number') {
46-
const err = ctx.err(ValidationError.NUM_MIN, path);
46+
const err = ctx.err(ValidationError.GT, path);
4747
ctx.js(/* js */ `if(${r} <= ${gt}) return ${err};`);
4848
}
4949
if (typeof lte === 'number') {
50-
const err = ctx.err(ValidationError.NUM_MAX, path);
50+
const err = ctx.err(ValidationError.LTE, path);
5151
ctx.js(/* js */ `if(${r} > ${lte}) return ${err};`);
5252
}
5353
if (typeof lt === 'number') {
54-
const err = ctx.err(ValidationError.NUM_MAX, path);
54+
const err = ctx.err(ValidationError.LT, path);
5555
ctx.js(/* js */ `if(${r} >= ${lt}) return ${err};`);
5656
}
5757

5858
const customFormatValidation = () => {
5959
if (format === 'u8') {
60-
const err = ctx.err(ValidationError.NUM_TYPE, path);
60+
const err = ctx.err(ValidationError.UINT, path);
6161
ctx.js(/* js */ `if(${r} < 0 || ${r} > 255) return ${err};`);
6262
} else if (format === 'u16') {
63-
const err = ctx.err(ValidationError.NUM_TYPE, path);
63+
const err = ctx.err(ValidationError.UINT, path);
6464
ctx.js(/* js */ `if(${r} < 0 || ${r} > 65535) return ${err};`);
6565
} else if (format === 'u32') {
66-
const err = ctx.err(ValidationError.NUM_TYPE, path);
66+
const err = ctx.err(ValidationError.UINT, path);
6767
ctx.js(/* js */ `if(${r} < 0 || ${r} > 4294967295) return ${err};`);
6868
} else if (format === 'i8') {
69-
const err = ctx.err(ValidationError.NUM_TYPE, path);
69+
const err = ctx.err(ValidationError.INT, path);
7070
ctx.js(/* js */ `if(${r} < -128 || ${r} > 127) return ${err};`);
7171
} else if (format === 'i16') {
72-
const err = ctx.err(ValidationError.NUM_TYPE, path);
72+
const err = ctx.err(ValidationError.INT, path);
7373
ctx.js(/* js */ `if(${r} < -32768 || ${r} > 32767) return ${err};`);
7474
} else if (format === 'i32') {
75-
const err = ctx.err(ValidationError.NUM_TYPE, path);
75+
const err = ctx.err(ValidationError.INT, path);
7676
ctx.js(/* js */ `if(${r} < -2147483648 || ${r} > 2147483647) return ${err};`);
7777
}
7878
};
@@ -173,7 +173,7 @@ export const tup = (ctx: ValidatorCodegenContext, path: ValidationPath, r: strin
173173
const ri = ctx.codegen.getRegister();
174174
const rv = ctx.codegen.getRegister();
175175
const err = ctx.err(ValidationError.TUP, path);
176-
const errLen = ctx.err(ValidationError.TUP_LEN, path);
176+
const errLen = ctx.err(ValidationError.ARR_LEN, path);
177177
const types = tupType.types;
178178
ctx.js(/* js */ `if (!Array.isArray(${r})) return ${err};`);
179179
ctx.js(`if (${r}.length !== ${types.length}) return ${errLen};`);
@@ -218,7 +218,7 @@ export const obj = (
218218
ctx.js(`var ${rv} = ${r}${accessor};`);
219219
validateFn(ctx, [...path, {r: JSON.stringify(key)}], rv, field.value);
220220
} else {
221-
const keyErr = ctx.err(ValidationError.OBJ_KEY, [...path, {r: JSON.stringify(key)}]);
221+
const keyErr = ctx.err(ValidationError.KEY, [...path, {r: JSON.stringify(key)}]);
222222
ctx.js(`var ${rv} = ${r}${accessor};`);
223223
ctx.js(`if (${rv} === undefined) return ${keyErr};`);
224224
validateFn(ctx, [...path, {r: JSON.stringify(key)}], rv, field.value);
@@ -239,15 +239,15 @@ export const obj = (
239239
// Check for unknown fields if necessary
240240
if (!ctx.options.skipObjectExtraFieldsCheck && !objType.schema.unknownFields) {
241241
const knownKeys = fields.map((field: any) => field.key);
242-
const unknownFieldsError = ctx.err(ValidationError.OBJ_EXTRA, path);
242+
const unknownFieldsError = ctx.err(ValidationError.KEYS, path);
243243
const rk = ctx.codegen.getRegister();
244244
const rkl = ctx.codegen.getRegister();
245245
const ri = ctx.codegen.getRegister();
246246
const rkey = ctx.codegen.getRegister();
247247
ctx.js(`var ${rk} = Object.keys(${r}), ${rkl} = ${rk}.length, ${ri} = 0, ${rkey};`);
248248
ctx.js(`for (; ${ri} < ${rkl}; ${ri}++) {`);
249249
ctx.js(`${rkey} = ${rk}[${ri}];`);
250-
const knownKeysCheck = knownKeys.map(key => `${rkey} !== ${JSON.stringify(key)}`).join(' && ');
250+
const knownKeysCheck = knownKeys.map((key: string) => `${rkey} !== ${JSON.stringify(key)}`).join(' && ');
251251
if (knownKeysCheck) {
252252
ctx.js(`if (${knownKeysCheck}) return ${unknownFieldsError};`);
253253
}
@@ -291,7 +291,7 @@ export const ref = (
291291
const refType = type as any; // RefType
292292
const system = ctx.options.system || refType.system;
293293
if (!system) throw new Error('NO_SYSTEM');
294-
const validator = system.resolve(refType.schema.ref).type.validator(ctx.errors);
294+
const validator = system.resolve(refType.schema.ref).type.validator(ctx.options.errors);
295295
const d = ctx.codegen.linkDependency(validator);
296296
const rv = ctx.codegen.getRegister();
297297
ctx.js(`var ${rv} = ${d}(${r});`);

src/type/classes/AbsType.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,9 @@ export abstract class AbsType<S extends schema.Schema> implements BaseType<S>, P
178178
}
179179

180180
public codegenJsonTextEncoder(ctx: JsonTextEncoderCodegenContext, value: JsExpression): void {
181-
throw new Error(`${this.toStringName()}.codegenJsonTextEncoder() not implemented`);
181+
// Use the centralized router function
182+
const {generate} = require('../../codegen/json/jsonTextEncoders');
183+
generate(ctx, value, this as any);
182184
}
183185

184186
private __jsonEncoder: JsonEncoderFn | undefined;
@@ -228,7 +230,9 @@ export abstract class AbsType<S extends schema.Schema> implements BaseType<S>, P
228230
}
229231

230232
public codegenValidator(ctx: ValidatorCodegenContext, path: ValidationPath, r: string): void {
231-
throw new Error(`${this.toStringName()}.codegenValidator() not implemented`);
233+
// Use the centralized router function
234+
const {generate} = require('../../codegen/validator/validators');
235+
generate(ctx, path, r, this as any);
232236
}
233237

234238
public compileCborEncoder(
@@ -247,7 +251,9 @@ export abstract class AbsType<S extends schema.Schema> implements BaseType<S>, P
247251
}
248252

249253
public codegenCborEncoder(ctx: CborEncoderCodegenContext, value: JsExpression): void {
250-
throw new Error(`${this.toStringName()}.codegenCborEncoder() not implemented`);
254+
// Use the centralized router function
255+
const {generate} = require('../../codegen/binary/cborEncoders');
256+
generate(ctx, value, this as any);
251257
}
252258

253259
public compileMessagePackEncoder(
@@ -266,7 +272,9 @@ export abstract class AbsType<S extends schema.Schema> implements BaseType<S>, P
266272
}
267273

268274
public codegenMessagePackEncoder(ctx: MessagePackEncoderCodegenContext, value: JsExpression): void {
269-
throw new Error(`${this.toStringName()}.codegenMessagePackEncoder() not implemented`);
275+
// Use the centralized router function
276+
const {generate} = require('../../codegen/binary/messagePackEncoders');
277+
generate(ctx, value, this as any);
270278
}
271279

272280
public compileJsonEncoder(
@@ -286,7 +294,9 @@ export abstract class AbsType<S extends schema.Schema> implements BaseType<S>, P
286294
}
287295

288296
public codegenJsonEncoder(ctx: JsonEncoderCodegenContext, value: JsExpression): void {
289-
throw new Error(`${this.toStringName()}.codegenJsonEncoder() not implemented`);
297+
// Use the centralized router function
298+
const {generate} = require('../../codegen/binary/jsonEncoders');
299+
generate(ctx, value, this as any);
290300
}
291301

292302
public codegenCapacityEstimator(ctx: CapacityEstimatorCodegenContext, value: JsExpression): void {

src/type/classes/BoolType.ts

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -26,32 +26,6 @@ export class BoolType extends AbsType<schema.BooleanSchema> {
2626
super();
2727
}
2828

29-
public codegenValidator(ctx: ValidatorCodegenContext, path: ValidationPath, r: string): void {
30-
const err = ctx.err(ValidationError.BOOL, path);
31-
ctx.js(/* js */ `if(typeof ${r} !== "boolean") return ${err};`);
32-
ctx.emitCustomValidators(this, path, r);
33-
}
34-
35-
public codegenJsonTextEncoder(ctx: JsonTextEncoderCodegenContext, value: JsExpression): void {
36-
ctx.js(/* js */ `s += ${value.use()} ? 'true' : 'false';`);
37-
}
38-
39-
protected codegenBinaryEncoder(ctx: BinaryEncoderCodegenContext<BinaryJsonEncoder>, value: JsExpression): void {
40-
ctx.js(/* js */ `encoder.writeBoolean(${value.use()});`);
41-
}
42-
43-
public codegenCborEncoder(ctx: CborEncoderCodegenContext, value: JsExpression): void {
44-
this.codegenBinaryEncoder(ctx, value);
45-
}
46-
47-
public codegenMessagePackEncoder(ctx: MessagePackEncoderCodegenContext, value: JsExpression): void {
48-
this.codegenBinaryEncoder(ctx, value);
49-
}
50-
51-
public codegenJsonEncoder(ctx: JsonEncoderCodegenContext, value: JsExpression): void {
52-
this.codegenBinaryEncoder(ctx, value);
53-
}
54-
5529
public toJson(value: unknown, system: TypeSystem | undefined = this.system) {
5630
return (value ? 'true' : 'false') as json_string<boolean>;
5731
}

0 commit comments

Comments
 (0)