@@ -258,32 +258,50 @@ impl jtd_codegen::target::Target for Target {
258258
259259 writeln ! ( out) ?;
260260 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+
263268 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) ?;
266270 }
267- writeln ! ( out, "}}" ) ?;
271+ writeln ! ( out) ?;
268272
273+ for variant in & variants {
274+ writeln ! ( out, "func ({}) is{}() {{}}" , variant. type_name, name) ?;
275+ }
269276 writeln ! ( out) ?;
270- writeln ! ( out, "func (v {}) MarshalJSON() ([]byte, error) {{" , name) ?;
271- writeln ! ( out, "\t switch v.{} {{" , tag_field_name) ?;
277+
272278 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) ?;
275289 }
276- writeln ! ( out , " \t }}" ) ? ;
290+
277291 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, "// {}JSON 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 {}JSON struct {{" , name) ?;
300+ writeln ! ( out, "\t {}" , name) ?;
283301 writeln ! ( out, "}}" ) ?;
284302
285303 writeln ! ( out) ?;
286- writeln ! ( out, "func (v *{}) UnmarshalJSON(b []byte) error {{" , name) ?;
304+ writeln ! ( out, "func (v *{}JSON ) UnmarshalJSON(b []byte) error {{" , name) ?;
287305 writeln ! (
288306 out,
289307 "\t var t struct {{ T string `json:\" {}\" ` }}" ,
@@ -293,29 +311,30 @@ impl jtd_codegen::target::Target for Target {
293311 writeln ! ( out, "\t \t return err" ) ?;
294312 writeln ! ( out, "\t }}" ) ?;
295313 writeln ! ( out) ?;
314+ writeln ! ( out, "\t var value {}" , name) ?;
296315 writeln ! ( out, "\t var err error" ) ?;
316+ writeln ! ( out) ?;
297317 writeln ! ( out, "\t switch t.T {{" ) ?;
298318 for variant in & variants {
299319 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" ) ?;
305323 }
306324 writeln ! ( out, "\t default:" ) ?;
307325 writeln ! (
308326 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
311330 ) ?;
312331 writeln ! ( out, "\t }}" ) ?;
313332 writeln ! ( out) ?;
314333 writeln ! ( out, "\t if err != nil {{" ) ?;
315334 writeln ! ( out, "\t \t return err" ) ?;
316335 writeln ! ( out, "\t }}" ) ?;
317336 writeln ! ( out) ?;
318- writeln ! ( out, "\t v.{} = t.T " , tag_field_name ) ?;
337+ writeln ! ( out, "\t v.{} = value " , name ) ?;
319338 writeln ! ( out, "\t return nil" ) ?;
320339 writeln ! ( out, "}}" ) ?;
321340
0 commit comments