@@ -258,32 +258,51 @@ impl jtd_codegen::target::Target for Target {
258
258
259
259
writeln ! ( out) ?;
260
260
write ! ( out, "{}" , description( & metadata, 0 ) ) ?;
261
- writeln ! ( out, "type {} struct {{" , name) ?;
262
- writeln ! ( out, "\t {} string" , tag_field_name) ?;
261
+ writeln ! ( out, "type {} interface {{" , name) ?;
262
+ writeln ! ( out, "\t json.Marshaler" ) ?;
263
+ writeln ! ( out, "\t {}() string" , tag_field_name) ?;
264
+ writeln ! ( out, "\t is{}()" , name) ?;
265
+ writeln ! ( out, "}}" ) ?;
266
+ writeln ! ( out) ?;
267
+
263
268
for variant in & variants {
264
- writeln ! ( out) ?;
265
- writeln ! ( out, "\t {} {}" , & variant. field_name, & variant. type_name) ?;
269
+ writeln ! ( out, "func ({}) {}() string {{ return {:?} }}" , variant. type_name, tag_field_name, variant. tag_value) ?;
266
270
}
267
- writeln ! ( out, "}}" ) ?;
271
+ writeln ! ( out) ?;
268
272
273
+ for variant in & variants {
274
+ writeln ! ( out, "func ({}) is{}() {{}}" , variant. type_name, name) ?;
275
+ }
269
276
writeln ! ( out) ?;
270
- writeln ! ( out, "func (v {}) MarshalJSON() ([]byte, error) {{" , name) ?;
271
- writeln ! ( out, "\t switch v.{} {{" , tag_field_name) ?;
277
+
272
278
for variant in & variants {
273
- writeln ! ( out, "\t case {:?}:" , variant. tag_value) ?;
274
- writeln ! ( out, "\t \t return json.Marshal(struct {{ T string `json:\" {}\" `; {} }}{{ v.{}, v.{} }})" , tag_json_name, variant. type_name, tag_field_name, variant. field_name) ?;
279
+ writeln ! ( out, "func (v {}) MarshalJSON() ([]byte, error) {{" , variant. type_name) ?;
280
+ writeln ! ( out, "\t type Alias {}" , variant. type_name) ?;
281
+ writeln ! ( out, "\t return json.Marshal(struct {{" ) ?;
282
+ writeln ! ( out, "\t \t T string `json:\" {}\" `" , tag_json_name) ?;
283
+ writeln ! ( out, "\t \t Alias" ) ?;
284
+ writeln ! ( out, "\t }}{{" ) ?;
285
+ writeln ! ( out, "\t \t v.{}()," , tag_field_name) ?;
286
+ writeln ! ( out, "\t \t Alias(v)," ) ?;
287
+ writeln ! ( out, "\t }})" ) ?;
288
+ writeln ! ( out, "}}" ) ?;
289
+ writeln ! ( out) ?;
275
290
}
276
- writeln ! ( out , " \t }}" ) ? ;
291
+
277
292
writeln ! ( out) ?;
278
- writeln ! (
279
- out,
280
- "\t return nil, fmt.Errorf(\" bad {0} value: %s\" , v.{0})" ,
281
- tag_field_name
282
- ) ?;
293
+ writeln ! ( out, "// {}JSON wraps the interface that it embeds. It can be" , name) ?;
294
+ writeln ! ( out, "// the following types:" ) ?;
295
+ writeln ! ( out, "//" ) ?;
296
+ for variant in & variants {
297
+ writeln ! ( out, "\t // - [{}] ({})" , & variant. type_name, & variant. tag_value) ?;
298
+ }
299
+ writeln ! ( out, "//" ) ?;
300
+ writeln ! ( out, "type {}JSON struct {{" , name) ?;
301
+ writeln ! ( out, "\t {}" , name) ?;
283
302
writeln ! ( out, "}}" ) ?;
284
303
285
304
writeln ! ( out) ?;
286
- writeln ! ( out, "func (v *{}) UnmarshalJSON(b []byte) error {{" , name) ?;
305
+ writeln ! ( out, "func (v *{}JSON ) UnmarshalJSON(b []byte) error {{" , name) ?;
287
306
writeln ! (
288
307
out,
289
308
"\t var t struct {{ T string `json:\" {}\" ` }}" ,
@@ -293,29 +312,30 @@ impl jtd_codegen::target::Target for Target {
293
312
writeln ! ( out, "\t \t return err" ) ?;
294
313
writeln ! ( out, "\t }}" ) ?;
295
314
writeln ! ( out) ?;
315
+ writeln ! ( out, "\t var value {}" , name) ?;
296
316
writeln ! ( out, "\t var err error" ) ?;
317
+ writeln ! ( out) ?;
297
318
writeln ! ( out, "\t switch t.T {{" ) ?;
298
319
for variant in & variants {
299
320
writeln ! ( out, "\t case {:?}:" , variant. tag_value) ?;
300
- writeln ! (
301
- out,
302
- "\t \t err = json.Unmarshal(b, &v.{})" ,
303
- variant. field_name
304
- ) ?;
321
+ writeln ! ( out, "\t \t var v {}" , variant. type_name) ?;
322
+ writeln ! ( out, "\t \t err = json.Unmarshal(b, &v)" ) ?;
323
+ writeln ! ( out, "\t \t value = v" ) ?;
305
324
}
306
325
writeln ! ( out, "\t default:" ) ?;
307
326
writeln ! (
308
327
out,
309
- "\t \t err = fmt.Errorf(\" bad {} value: %s\" , t.T)" ,
310
- tag_field_name
328
+ "\t \t err = fmt.Errorf(\" {}: bad {} value: %q\" , t.T)" ,
329
+ name,
330
+ tag_json_name
311
331
) ?;
312
332
writeln ! ( out, "\t }}" ) ?;
313
333
writeln ! ( out) ?;
314
334
writeln ! ( out, "\t if err != nil {{" ) ?;
315
335
writeln ! ( out, "\t \t return err" ) ?;
316
336
writeln ! ( out, "\t }}" ) ?;
317
337
writeln ! ( out) ?;
318
- writeln ! ( out, "\t v.{} = t.T " , tag_field_name ) ?;
338
+ writeln ! ( out, "\t v.{} = value " , name ) ?;
319
339
writeln ! ( out, "\t return nil" ) ?;
320
340
writeln ! ( out, "}}" ) ?;
321
341
0 commit comments