Skip to content

Commit 846a55c

Browse files
committed
feat(json-type): 🎸 progress towards JSON codegen
1 parent 082e4b8 commit 846a55c

File tree

2 files changed

+28
-16
lines changed

2 files changed

+28
-16
lines changed

src/json-type/codegen/json/__tests__/json.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,18 @@ describe('"obj" type', () => {
121121
});
122122
});
123123

124+
describe('"map" type', () => {
125+
test('serializes a map', () => {
126+
const type = s.Map(s.num);
127+
exec(type, {a: 1, b: 2, c: 3});
128+
});
129+
130+
test('serializes a map in a map', () => {
131+
const type = s.Map(s.Map(s.bool));
132+
exec(type, {a: {b: true}});
133+
});
134+
});
135+
124136
describe('general', () => {
125137
test('serializes according to schema a POJO object', () => {
126138
const type = s.Object({

src/json-type/type/classes.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1931,22 +1931,22 @@ export class MapType<T extends Type> extends AbstractType<schema.MapSchema<Schem
19311931
}
19321932

19331933
public codegenJsonTextEncoder(ctx: JsonTextEncoderCodegenContext, value: JsExpression): void {
1934-
throw new Error('TODO');
1935-
// ctx.writeText('[');
1936-
// const codegen = ctx.codegen;
1937-
// const r = codegen.getRegister(); // array
1938-
// const rl = codegen.getRegister(); // array.length
1939-
// const rll = codegen.getRegister(); // last
1940-
// const ri = codegen.getRegister(); // index
1941-
// ctx.js(/* js */ `var ${r} = ${value.use()}, ${rl} = ${r}.length, ${rll} = ${rl} - 1, ${ri} = 0;`);
1942-
// ctx.js(/* js */ `for(; ${ri} < ${rll}; ${ri}++) ` + '{');
1943-
// this.type.codegenJsonTextEncoder(ctx, new JsExpression(() => `${r}[${ri}]`));
1944-
// ctx.js(/* js */ `s += ',';`);
1945-
// ctx.js(`}`);
1946-
// ctx.js(`if (${rl}) {`);
1947-
// this.type.codegenJsonTextEncoder(ctx, new JsExpression(() => `${r}[${rll}]`));
1948-
// ctx.js(`}`);
1949-
// ctx.writeText(']');
1934+
ctx.writeText('{');
1935+
const r = ctx.codegen.var(value.use());
1936+
const rKeys = ctx.codegen.var(`Object.keys(${r})`);
1937+
const rLength = ctx.codegen.var(`${rKeys}.length`);
1938+
const rKey = ctx.codegen.r();
1939+
const rValue = ctx.codegen.r();
1940+
ctx.codegen.if(`${rLength}`, () => {
1941+
ctx.js(`s += asString(${rKeys}[i]) + ':';`);
1942+
this.type.codegenJsonTextEncoder(ctx, new JsExpression(() => `${r}[${rKey}]`));
1943+
});
1944+
ctx.js(`for (var ${rKey}, ${rValue}, i = 1; i < ${rLength}; i++) {`);
1945+
ctx.js(`${rKey} = ${rKeys}[i];`);
1946+
ctx.js(`s += ',' + asString(${rKey}) + ':';`);
1947+
this.type.codegenJsonTextEncoder(ctx, new JsExpression(() => `${r}[${rKey}]`));
1948+
ctx.js(`}`);
1949+
ctx.writeText('}');
19501950
}
19511951

19521952
private codegenBinaryEncoder(ctx: BinaryEncoderCodegenContext<BinaryJsonEncoder>, value: JsExpression): void {

0 commit comments

Comments
 (0)