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