Skip to content

Commit dd2f735

Browse files
committed
fix enum setters in the presence of defaults
1 parent 1ce11c2 commit dd2f735

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

capnpc/src/codegen.rs

+14-3
Original file line numberDiff line numberDiff line change
@@ -1006,9 +1006,20 @@ fn generate_setter(
10061006
type_::Enum(e) => {
10071007
let id = e.get_type_id();
10081008
let the_mod = ctx.get_qualified_module(id);
1009-
setter_interior.push(Line(format!(
1010-
"self.builder.set_data_field::<u16>({offset}, value as u16)"
1011-
)));
1009+
if !reg_field.get_had_explicit_default() {
1010+
setter_interior.push(Line(format!(
1011+
"self.builder.set_data_field::<u16>({offset}, value as u16);"
1012+
)));
1013+
} else {
1014+
match reg_field.get_default_value()?.which()? {
1015+
schema_capnp::value::Enum(d) => {
1016+
setter_interior.push(Line(format!(
1017+
"self.builder.set_data_field_mask::<u16>({offset}, value as u16, {d});"
1018+
)));
1019+
}
1020+
_ => return Err(Error::failed("enum default not an Enum".to_string())),
1021+
}
1022+
};
10121023
(Some(the_mod), None)
10131024
}
10141025
type_::Struct(_) => {

capnpc/test/test.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ mod tests {
492492

493493
#[test]
494494
fn test_defaults() {
495-
use crate::test_capnp::test_defaults;
495+
use crate::test_capnp::{test_defaults, TestEnum};
496496

497497
{
498498
let message = message::Builder::new_default();
@@ -524,6 +524,7 @@ mod tests {
524524
test_defaults.set_u_int64_field(123456789012345);
525525
test_defaults.set_float32_field(7890.123);
526526
test_defaults.set_float64_field(5e55);
527+
test_defaults.set_enum_field(TestEnum::Baz);
527528

528529
{
529530
let mut sub_builder = test_defaults.reborrow().get_struct_field().unwrap();
@@ -544,6 +545,10 @@ mod tests {
544545
);
545546
assert_eq!(test_defaults.reborrow().get_float32_field(), 7890.123);
546547
assert_eq!(test_defaults.reborrow().get_float64_field(), 5e55);
548+
assert_eq!(
549+
test_defaults.reborrow().get_enum_field().unwrap(),
550+
TestEnum::Baz
551+
);
547552

548553
{
549554
let sub_builder = test_defaults.reborrow().get_struct_field().unwrap();

0 commit comments

Comments
 (0)