@@ -259,27 +259,12 @@ 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) ?;
263
- for variant in & variants {
264
- writeln ! ( out) ?;
265
- writeln ! ( out, "\t {} {}" , & variant. field_name, & variant. type_name) ?;
266
- }
262
+ writeln ! ( out, "\t Value I{} `json:\" -\" `" , name) ?;
267
263
writeln ! ( out, "}}" ) ?;
268
264
269
265
writeln ! ( out) ?;
270
266
writeln ! ( out, "func (v {}) MarshalJSON() ([]byte, error) {{" , name) ?;
271
- writeln ! ( out, "\t switch v.{} {{" , tag_field_name) ?;
272
- 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
- }
276
- 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
- ) ?;
267
+ writeln ! ( out, "\t return json.Marshal(v.Value)" ) ?;
283
268
writeln ! ( out, "}}" ) ?;
284
269
285
270
writeln ! ( out) ?;
@@ -293,32 +278,114 @@ impl jtd_codegen::target::Target for Target {
293
278
writeln ! ( out, "\t \t return err" ) ?;
294
279
writeln ! ( out, "\t }}" ) ?;
295
280
writeln ! ( out) ?;
281
+ writeln ! ( out, "\t var value I{}" , name) ?;
296
282
writeln ! ( out, "\t var err error" ) ?;
283
+ writeln ! ( out) ?;
297
284
writeln ! ( out, "\t switch t.T {{" ) ?;
298
285
for variant in & variants {
299
286
writeln ! ( out, "\t case {:?}:" , variant. tag_value) ?;
300
- writeln ! (
301
- out,
302
- "\t \t err = json.Unmarshal(b, &v.{})" ,
303
- variant. field_name
304
- ) ?;
287
+ writeln ! ( out, "\t \t var v {}" , variant. type_name) ?;
288
+ writeln ! ( out, "\t \t err = json.Unmarshal(b, &v)" ) ?;
289
+ writeln ! ( out, "\t \t value = v" ) ?;
305
290
}
306
291
writeln ! ( out, "\t default:" ) ?;
307
292
writeln ! (
308
293
out,
309
- "\t \t err = fmt.Errorf(\" bad {} value: %s \" , t.T)" ,
310
- tag_field_name
294
+ "\t \t err = fmt.Errorf(\" {}: bad {} value: %q \" , t.T)" ,
295
+ name , tag_json_name
311
296
) ?;
312
297
writeln ! ( out, "\t }}" ) ?;
313
298
writeln ! ( out) ?;
314
299
writeln ! ( out, "\t if err != nil {{" ) ?;
315
300
writeln ! ( out, "\t \t return err" ) ?;
316
301
writeln ! ( out, "\t }}" ) ?;
317
302
writeln ! ( out) ?;
318
- writeln ! ( out, "\t v.{} = t.T" , tag_field_name ) ?;
303
+ writeln ! ( out, "\t v.Value = value" ) ?;
319
304
writeln ! ( out, "\t return nil" ) ?;
320
305
writeln ! ( out, "}}" ) ?;
321
306
307
+ writeln ! ( out) ?;
308
+ writeln ! (
309
+ out,
310
+ "// I{} is an interface type that {} types implement." ,
311
+ name, name
312
+ ) ?;
313
+ writeln ! ( out, "// It can be the following types:" ) ?;
314
+ writeln ! ( out, "//" ) ?;
315
+ for variant in & variants {
316
+ writeln ! (
317
+ out,
318
+ "// - [{}] ({})" ,
319
+ & variant. type_name, & variant. tag_value
320
+ ) ?;
321
+ }
322
+ writeln ! ( out, "//" ) ?;
323
+ writeln ! ( out, "type I{} interface {{" , name) ?;
324
+ writeln ! ( out, "\t {}() string" , tag_field_name) ?;
325
+ writeln ! ( out, "\t is{}()" , name) ?;
326
+ writeln ! ( out, "}}" ) ?;
327
+ writeln ! ( out) ?;
328
+
329
+ for variant in & variants {
330
+ writeln ! (
331
+ out,
332
+ "func ({}) {}() string {{ return {:?} }}" ,
333
+ variant. type_name, tag_field_name, variant. tag_value
334
+ ) ?;
335
+ }
336
+ writeln ! ( out) ?;
337
+
338
+ for variant in & variants {
339
+ writeln ! ( out, "func ({}) is{}() {{}}" , variant. type_name, name) ?;
340
+ }
341
+ writeln ! ( out) ?;
342
+
343
+ for variant in & variants {
344
+ writeln ! (
345
+ out,
346
+ "func (v {}) MarshalJSON() ([]byte, error) {{" ,
347
+ variant. type_name
348
+ ) ?;
349
+ writeln ! ( out, "\t type Alias {}" , variant. type_name) ?;
350
+ writeln ! ( out, "\t return json.Marshal(struct {{" ) ?;
351
+ writeln ! ( out, "\t \t T string `json:\" {}\" `" , tag_json_name) ?;
352
+ writeln ! ( out, "\t \t Alias" ) ?;
353
+ writeln ! ( out, "\t }}{{" ) ?;
354
+ writeln ! ( out, "\t \t v.{}()," , tag_field_name) ?;
355
+ writeln ! ( out, "\t \t Alias(v)," ) ?;
356
+ writeln ! ( out, "\t }})" ) ?;
357
+ writeln ! ( out, "}}" ) ?;
358
+ writeln ! ( out) ?;
359
+
360
+ writeln ! (
361
+ out,
362
+ "func (v *{}) UnmarshalJSON(b []byte) error {{" ,
363
+ variant. type_name
364
+ ) ?;
365
+ writeln ! ( out, "\t type Alias {}" , variant. type_name) ?;
366
+ writeln ! ( out, "\t var a struct {{" ) ?;
367
+ writeln ! ( out, "\t \t T string `json:\" {}\" `" , tag_json_name) ?;
368
+ writeln ! ( out, "\t \t Alias" ) ?;
369
+ writeln ! ( out, "\t }}" ) ?;
370
+ writeln ! ( out) ?;
371
+ writeln ! ( out, "\t if err := json.Unmarshal(b, &a); err != nil {{" ) ?;
372
+ writeln ! ( out, "\t \t return err" ) ?;
373
+ writeln ! ( out, "\t }}" ) ?;
374
+ writeln ! ( out) ?;
375
+ writeln ! ( out, "\t if a.T != {:?} {{" , variant. tag_value) ?;
376
+ writeln ! (
377
+ out,
378
+ "\t \t return fmt.Errorf(\" {}: bad {} value: %q\" , a.T)" ,
379
+ variant. type_name, tag_json_name
380
+ ) ?;
381
+ writeln ! ( out, "\t }}" ) ?;
382
+ writeln ! ( out) ?;
383
+ writeln ! ( out, "\t *v = {}(a.Alias)" , variant. type_name) ?;
384
+ writeln ! ( out, "\t return nil" ) ?;
385
+ writeln ! ( out, "}}" ) ?;
386
+ writeln ! ( out) ?;
387
+ }
388
+
322
389
None
323
390
}
324
391
0 commit comments