Skip to content

Commit dcbba61

Browse files
committed
Generate Go interfaces for discriminators
This commit implements jsontypedef/issues/67.
1 parent a42555d commit dcbba61

File tree

1 file changed

+26
-18
lines changed

1 file changed

+26
-18
lines changed

crates/target_go/src/lib.rs

+26-18
Original file line numberDiff line numberDiff line change
@@ -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, "\tValue value{}", name)?;
267+
writeln!(out)?;
268+
writeln!(out, "\tt string")?;
267269
writeln!(out, "}}")?;
268270

269271
writeln!(out)?;
270272
writeln!(out, "func (v {}) MarshalJSON() ([]byte, error) {{", name)?;
271-
writeln!(out, "\tswitch v.{} {{", tag_field_name)?;
273+
writeln!(out, "\tswitch value := v.Value.(type) {{")?;
272274
for variant in &variants {
273-
writeln!(out, "\tcase {:?}:", variant.tag_value)?;
274-
writeln!(out, "\t\treturn json.Marshal(struct {{ T string `json:\"{}\"`; {} }}{{ v.{}, v.{} }})", tag_json_name, variant.type_name, tag_field_name, variant.field_name)?;
275+
writeln!(out, "\tcase {}:", variant.type_name)?;
276+
writeln!(out, "\t\treturn json.Marshal(struct {{ T string `json:\"{}\"`; {} }}{{ {:?}, value }})", tag_json_name, variant.type_name, variant.tag_value)?;
275277
}
278+
writeln!(out, "\tdefault:")?;
279+
writeln!(out, "\t\tpanic(\"unreachable\")")?;
276280
writeln!(out, "\t}}")?;
277-
writeln!(out)?;
278-
writeln!(
279-
out,
280-
"\treturn 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\treturn err")?;
294292
writeln!(out, "\t}}")?;
295293
writeln!(out)?;
294+
writeln!(out, "\tvar value value{}", name)?;
296295
writeln!(out, "\tvar err error")?;
296+
writeln!(out)?;
297297
writeln!(out, "\tswitch t.T {{")?;
298298
for variant in &variants {
299299
writeln!(out, "\tcase {:?}:", variant.tag_value)?;
300-
writeln!(
301-
out,
302-
"\t\terr = json.Unmarshal(b, &v.{})",
303-
variant.field_name
304-
)?;
300+
writeln!(out, "\t\tvar v {}", variant.type_name)?;
301+
writeln!(out, "\t\terr = json.Unmarshal(b, &v)")?;
302+
writeln!(out, "\t\tvalue = v")?;
305303
}
306304
writeln!(out, "\tdefault:")?;
307305
writeln!(
@@ -315,10 +313,20 @@ impl jtd_codegen::target::Target for Target {
315313
writeln!(out, "\t\treturn err")?;
316314
writeln!(out, "\t}}")?;
317315
writeln!(out)?;
318-
writeln!(out, "\tv.{} = t.T", tag_field_name)?;
316+
writeln!(out, "\tv.t = t.T")?;
317+
writeln!(out, "\tv.Value = value")?;
319318
writeln!(out, "\treturn nil")?;
320319
writeln!(out, "}}")?;
321320

321+
writeln!(out)?;
322+
writeln!(out, "type value{} interface {{", name)?;
323+
writeln!(out, "\tis{}()", 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

Comments
 (0)