Skip to content

Commit 2cea57f

Browse files
committed
Don't output a discriminator for unflattened unnamed-discriminator union
1 parent f7ecd75 commit 2cea57f

3 files changed

Lines changed: 31 additions & 23 deletions

File tree

capnp-json/src/encode.rs

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -221,26 +221,35 @@ fn write_object<'reader, W: std::io::Write>(
221221
let mut value_name = active_union_member_meta.name;
222222
let mut suppress_void = false;
223223
if let Some(discriminator) = discriminator {
224-
suppress_void = true;
225-
if !*first {
226-
write!(writer, ",")?;
227-
}
228-
*first = false;
229224
let discriminator_name = if discriminator.has_name() {
230-
discriminator.get_name()?.to_str()?
225+
Some(discriminator.get_name()?.to_str()?)
226+
} else if flatten {
227+
Some(meta.name)
231228
} else {
232-
meta.name
229+
// https://github.com/capnproto/capnproto/issues/2461
230+
// The discriminator is not output even if the annoyation is
231+
// present if:
232+
// - it doesn't have an explicit name, and
233+
// - the group is _not_ being flattened.
234+
None
233235
};
234236
if discriminator.has_value_name() {
235237
value_name = discriminator.get_value_name()?.to_str()?;
236238
}
237239

238-
write_string(
239-
writer,
240-
format!("{field_prefix}{discriminator_name}").as_str(),
241-
)?;
242-
write!(writer, ":")?;
243-
write_string(writer, active_union_member_meta.name)?;
240+
if let Some(discriminator_name) = discriminator_name {
241+
if !*first {
242+
write!(writer, ",")?;
243+
}
244+
*first = false;
245+
suppress_void = true;
246+
write_string(
247+
writer,
248+
format!("{field_prefix}{discriminator_name}").as_str(),
249+
)?;
250+
write!(writer, ":")?;
251+
write_string(writer, active_union_member_meta.name)?;
252+
}
244253
}
245254
let field_value = reader.get(active_union_member)?;
246255
if !suppress_void || !matches!(field_value, capnp::dynamic_value::Reader::Void) {

capnp-json/test/cppcompat.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -232,12 +232,13 @@ mod tests {
232232
root.reborrow().init_sbaz().set_sfoo("Hello");
233233

234234
let rust_json = capnp_json::to_json(root.reborrow_as_reader())?;
235-
eprintln!("Generated JSON: {}", rust_json);
235+
eprintln!("unnamed_discriminator Generated JSON: {}", rust_json);
236236

237237
let mut buf = vec![];
238238
capnp::serialize::write_message(&mut buf, &builder)?;
239+
239240
let cpp_json = cpp_binary_to_json("./json-test.capnp", "UnnamedDiscriminator", &buf)?;
240-
eprintln!("CPP generated JSON: {}", cpp_json);
241+
eprintln!("unnamed_discriminator CPP generated JSON: {}", cpp_json);
241242

242243
let mut read_json_builder = message::Builder::new_default();
243244
let mut read_json_root =
@@ -302,12 +303,13 @@ mod tests {
302303
root.reborrow().init_sbaz().set_sfoo("Hello");
303304

304305
let rust_json = capnp_json::to_json(root.reborrow_as_reader())?;
305-
eprintln!("Generated JSON: {}", rust_json);
306+
eprintln!("named_discriminator Generated JSON: {}", rust_json);
306307

307308
let mut buf = vec![];
308309
capnp::serialize::write_message(&mut buf, &builder)?;
309-
let cpp_json = cpp_binary_to_json("./json-test.capnp", "UnnamedDiscriminator", &buf)?;
310-
eprintln!("CPP generated JSON: {}", cpp_json);
310+
311+
let cpp_json = cpp_binary_to_json("./json-test.capnp", "NamedDiscriminator", &buf)?;
312+
eprintln!("named_discriminator CPP generated JSON: {}", cpp_json);
311313

312314
let mut read_json_builder = message::Builder::new_default();
313315
let mut read_json_root =
@@ -332,7 +334,7 @@ mod tests {
332334

333335
let cpp_binary = cpp_json_to_binary(
334336
"./json-test.capnp",
335-
"UnnamedDiscriminator",
337+
"NamedDiscriminator",
336338
rust_json.as_bytes(),
337339
)?;
338340
let mut cpp_binary = cpp_binary.as_slice();

capnp-json/test/json.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -780,10 +780,7 @@ mod tests {
780780
root.reborrow().init_baz().set_bar(100);
781781
root.reborrow().init_sbaz().set_sfoo("Hello");
782782
let json = json::to_json(root.reborrow_as_reader())?;
783-
assert_eq!(
784-
r#"{"baz":{"baz":"bar","bar":100},"sbaz":"sfoo","sfoo":"Hello"}"#,
785-
json
786-
);
783+
assert_eq!(r#"{"baz":{"bar":100},"sbaz":"sfoo","sfoo":"Hello"}"#, json);
787784

788785
let mut builder = capnp::message::Builder::new_default();
789786
let mut root =

0 commit comments

Comments
 (0)