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