@@ -259,27 +259,25 @@ impl jtd_codegen::target::Target for Target {
259259 writeln ! ( out) ?;
260260 write ! ( out, "{}" , description( & metadata, 0 ) ) ?;
261261 writeln ! ( out, "type {} struct {{" , name) ?;
262- writeln ! ( out, "\t {} string" , tag_field_name ) ?;
262+ writeln ! ( out, "\t // Value can be the following types:" ) ?;
263263 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) ?;
266265 }
266+ writeln ! ( out, "\t Value value{}" , name) ?;
267+ writeln ! ( out) ?;
268+ writeln ! ( out, "\t t string" ) ?;
267269 writeln ! ( out, "}}" ) ?;
268270
269271 writeln ! ( out) ?;
270272 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) {{" ) ?;
272274 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 ) ?;
275277 }
278+ writeln ! ( out, "\t default:" ) ?;
279+ writeln ! ( out, "\t \t panic(\" unreachable\" )" ) ?;
276280 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- ) ?;
283281 writeln ! ( out, "}}" ) ?;
284282
285283 writeln ! ( out) ?;
@@ -293,15 +291,15 @@ impl jtd_codegen::target::Target for Target {
293291 writeln ! ( out, "\t \t return err" ) ?;
294292 writeln ! ( out, "\t }}" ) ?;
295293 writeln ! ( out) ?;
294+ writeln ! ( out, "\t var value value{}" , name) ?;
296295 writeln ! ( out, "\t var err error" ) ?;
296+ writeln ! ( out) ?;
297297 writeln ! ( out, "\t switch t.T {{" ) ?;
298298 for variant in & variants {
299299 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" ) ?;
305303 }
306304 writeln ! ( out, "\t default:" ) ?;
307305 writeln ! (
@@ -315,10 +313,20 @@ impl jtd_codegen::target::Target for Target {
315313 writeln ! ( out, "\t \t return err" ) ?;
316314 writeln ! ( out, "\t }}" ) ?;
317315 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" ) ?;
319318 writeln ! ( out, "\t return nil" ) ?;
320319 writeln ! ( out, "}}" ) ?;
321320
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+
322330 None
323331 }
324332
0 commit comments