@@ -259,27 +259,31 @@ 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" ) ?;
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" ) ?;
267275 writeln ! ( out, "}}" ) ?;
268276
269277 writeln ! ( out) ?;
270278 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) {{" ) ?;
272280 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) ?;
275283 }
284+ writeln ! ( out, "\t default:" ) ?;
285+ writeln ! ( out, "\t \t panic(\" unreachable\" )" ) ?;
276286 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- ) ?;
283287 writeln ! ( out, "}}" ) ?;
284288
285289 writeln ! ( out) ?;
@@ -293,15 +297,15 @@ impl jtd_codegen::target::Target for Target {
293297 writeln ! ( out, "\t \t return err" ) ?;
294298 writeln ! ( out, "\t }}" ) ?;
295299 writeln ! ( out) ?;
300+ writeln ! ( out, "\t var value value{}" , name) ?;
296301 writeln ! ( out, "\t var err error" ) ?;
302+ writeln ! ( out) ?;
297303 writeln ! ( out, "\t switch t.T {{" ) ?;
298304 for variant in & variants {
299305 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" ) ?;
305309 }
306310 writeln ! ( out, "\t default:" ) ?;
307311 writeln ! (
@@ -315,10 +319,20 @@ impl jtd_codegen::target::Target for Target {
315319 writeln ! ( out, "\t \t return err" ) ?;
316320 writeln ! ( out, "\t }}" ) ?;
317321 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" ) ?;
319324 writeln ! ( out, "\t return nil" ) ?;
320325 writeln ! ( out, "}}" ) ?;
321326
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+
322336 None
323337 }
324338
0 commit comments