Skip to content

Commit ac9256d

Browse files
committed
feat(json-type): 🎸 implement codegen for JSON encoding in "map" type
1 parent 24917cc commit ac9256d

File tree

1 file changed

+25
-32
lines changed

1 file changed

+25
-32
lines changed

src/json-type/type/classes.ts

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1977,38 +1977,31 @@ export class MapType<T extends Type> extends AbstractType<schema.MapSchema<Schem
19771977
}
19781978

19791979
public codegenJsonEncoder(ctx: JsonEncoderCodegenContext, value: JsExpression): void {
1980-
throw new Error('TODO');
1981-
// const type = this.type;
1982-
// const codegen = ctx.codegen;
1983-
// const expr = new JsExpression(() => `${rItem}`);
1984-
// const r = codegen.var(value.use());
1985-
// const rLen = codegen.var(`${r}.length`);
1986-
// const rLast = codegen.var(`${rLen} - 1`);
1987-
// const ri = codegen.var('0');
1988-
// const rItem = codegen.var();
1989-
// ctx.blob(
1990-
// ctx.gen((encoder) => {
1991-
// encoder.writeStartArr();
1992-
// }),
1993-
// );
1994-
// codegen.js(`for(; ${ri} < ${rLast}; ${ri}++) {`);
1995-
// codegen.js(`${rItem} = ${r}[${ri}];`);
1996-
// type.codegenJsonEncoder(ctx, expr);
1997-
// ctx.blob(
1998-
// ctx.gen((encoder) => {
1999-
// encoder.writeArrSeparator();
2000-
// }),
2001-
// );
2002-
// ctx.js(`}`);
2003-
// ctx.js(`if (${rLen}) {`);
2004-
// codegen.js(`${rItem} = ${r}[${rLast}];`);
2005-
// type.codegenJsonEncoder(ctx, expr);
2006-
// ctx.js(`}`);
2007-
// ctx.blob(
2008-
// ctx.gen((encoder) => {
2009-
// encoder.writeEndArr();
2010-
// }),
2011-
// );
1980+
const type = this.type;
1981+
const objStartBlob = ctx.gen((encoder) => encoder.writeStartObj());
1982+
const objEndBlob = ctx.gen((encoder) => encoder.writeEndObj());
1983+
const separatorBlob = ctx.gen((encoder) => encoder.writeObjSeparator());
1984+
const keySeparatorBlob = ctx.gen((encoder) => encoder.writeObjKeySeparator());
1985+
const codegen = ctx.codegen;
1986+
const r = codegen.var(value.use());
1987+
const rKeys = codegen.var(`Object.keys(${r})`);
1988+
const rKey = codegen.var();
1989+
const rLength = codegen.var(`${rKeys}.length`);
1990+
ctx.blob(objStartBlob);
1991+
ctx.codegen.if(`${rLength}`, () => {
1992+
ctx.js(`${rKey} = ${rKeys}[0];`);
1993+
codegen.js(`encoder.writeStr(${rKey});`);
1994+
ctx.blob(keySeparatorBlob);
1995+
type.codegenJsonEncoder(ctx, new JsExpression(() => `${r}[${rKey}]`));
1996+
});
1997+
ctx.js(`for (var i = 1; i < ${rLength}; i++) {`);
1998+
ctx.js(`${rKey} = ${rKeys}[i];`);
1999+
ctx.blob(separatorBlob);
2000+
codegen.js(`encoder.writeStr(${rKey});`);
2001+
ctx.blob(keySeparatorBlob);
2002+
type.codegenJsonEncoder(ctx, new JsExpression(() => `${r}[${rKey}]`));
2003+
ctx.js(`}`);
2004+
ctx.blob(objEndBlob);
20122005
}
20132006

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

0 commit comments

Comments
 (0)