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