@@ -259,27 +259,25 @@ 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
+ writeln ! ( out) ?;
268
+ writeln ! ( out, "\t t string" ) ?;
267
269
writeln ! ( out, "}}" ) ?;
268
270
269
271
writeln ! ( out) ?;
270
272
writeln ! ( out, "func (v {}) MarshalJSON() ([]byte, error) {{" , name) ?;
271
- writeln ! ( out, "\t switch v.{} {{" , tag_field_name ) ?;
273
+ writeln ! ( out, "\t switch value := v.Value.(type) {{" ) ?;
272
274
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 ) ?;
275
+ writeln ! ( out, "\t case {}:" , variant. type_name ) ?;
276
+ writeln ! ( out, "\t \t return json.Marshal(struct {{ T string `json:\" {}\" `; {} }}{{ {:? }, value }})" , tag_json_name, variant. type_name, variant. tag_value ) ?;
275
277
}
278
+ writeln ! ( out, "\t default:" ) ?;
279
+ writeln ! ( out, "\t \t panic(\" unreachable\" )" ) ?;
276
280
writeln ! ( out, "\t }}" ) ?;
277
- writeln ! ( out) ?;
278
- writeln ! (
279
- out,
280
- "\t return nil, fmt.Errorf(\" bad {0} value: %s\" , v.{0})" ,
281
- tag_field_name
282
- ) ?;
283
281
writeln ! ( out, "}}" ) ?;
284
282
285
283
writeln ! ( out) ?;
@@ -293,15 +291,15 @@ impl jtd_codegen::target::Target for Target {
293
291
writeln ! ( out, "\t \t return err" ) ?;
294
292
writeln ! ( out, "\t }}" ) ?;
295
293
writeln ! ( out) ?;
294
+ writeln ! ( out, "\t var value value{}" , name) ?;
296
295
writeln ! ( out, "\t var err error" ) ?;
296
+ writeln ! ( out) ?;
297
297
writeln ! ( out, "\t switch t.T {{" ) ?;
298
298
for variant in & variants {
299
299
writeln ! ( out, "\t case {:?}:" , variant. tag_value) ?;
300
- writeln ! (
301
- out,
302
- "\t \t err = json.Unmarshal(b, &v.{})" ,
303
- variant. field_name
304
- ) ?;
300
+ writeln ! ( out, "\t \t var v {}" , variant. type_name) ?;
301
+ writeln ! ( out, "\t \t err = json.Unmarshal(b, &v)" ) ?;
302
+ writeln ! ( out, "\t \t value = v" ) ?;
305
303
}
306
304
writeln ! ( out, "\t default:" ) ?;
307
305
writeln ! (
@@ -315,10 +313,20 @@ impl jtd_codegen::target::Target for Target {
315
313
writeln ! ( out, "\t \t return err" ) ?;
316
314
writeln ! ( out, "\t }}" ) ?;
317
315
writeln ! ( out) ?;
318
- writeln ! ( out, "\t v.{} = t.T" , tag_field_name) ?;
316
+ writeln ! ( out, "\t v.t = t.T" ) ?;
317
+ writeln ! ( out, "\t v.Value = value" ) ?;
319
318
writeln ! ( out, "\t return nil" ) ?;
320
319
writeln ! ( out, "}}" ) ?;
321
320
321
+ writeln ! ( out) ?;
322
+ writeln ! ( out, "type value{} interface {{" , name) ?;
323
+ writeln ! ( out, "\t is{}()" , name) ?;
324
+ writeln ! ( out, "}}" ) ?;
325
+ writeln ! ( out) ?;
326
+ for variant in & variants {
327
+ writeln ! ( out, "func ({}) is{}() {{}}" , variant. type_name, name) ?;
328
+ }
329
+
322
330
None
323
331
}
324
332
0 commit comments