Skip to content

Commit 083b39c

Browse files
committed
Use SetterInput for more setters
1 parent 4602348 commit 083b39c

File tree

4 files changed

+40
-14
lines changed

4 files changed

+40
-14
lines changed

capnp/src/data.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,21 @@ impl<'a> crate::traits::SetterInput<Owned> for Reader<'a> {
8282
}
8383
}
8484

85+
impl<'a, const N: usize> crate::traits::SetterInput<Owned> for &'a [u8; N] {
86+
#[inline]
87+
fn set_pointer_builder<'b>(
88+
pointer: PointerBuilder<'b>,
89+
value: &'a [u8; N],
90+
canonicalize: bool,
91+
) -> Result<()> {
92+
<Reader<'a> as crate::traits::SetterInput<Owned>>::set_pointer_builder(
93+
pointer,
94+
&value[..],
95+
canonicalize,
96+
)
97+
}
98+
}
99+
85100
impl<'a> From<Reader<'a>> for crate::dynamic_value::Reader<'a> {
86101
fn from(d: Reader<'a>) -> crate::dynamic_value::Reader<'a> {
87102
crate::dynamic_value::Reader::Data(d)

capnp/src/data_list.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
//! List of sequences of bytes.
2323
2424
use crate::private::layout::*;
25-
use crate::traits::{FromPointerBuilder, FromPointerReader, IndexMove, ListIter};
25+
use crate::traits::{FromPointerBuilder, FromPointerReader, IndexMove, ListIter, SetterInput};
2626
use crate::Result;
2727

2828
#[derive(Copy, Clone)]
@@ -134,12 +134,17 @@ impl<'a> Builder<'a> {
134134
}
135135
}
136136

137-
pub fn set(&mut self, index: u32, value: crate::data::Reader) {
137+
#[inline]
138+
pub fn set(&mut self, index: u32, value: impl SetterInput<crate::data::Owned>) {
138139
assert!(index < self.len());
139-
self.builder
140-
.reborrow()
141-
.get_pointer_element(index)
142-
.set_data(value);
140+
SetterInput::set_pointer_builder(
141+
self.builder.reborrow().get_pointer_element(index),
142+
value,
143+
false,
144+
)
145+
.unwrap()
146+
// The text impls of SetterInput never return an error, so
147+
// the above unwrap() won't panic.
143148
}
144149

145150
pub fn reborrow(&mut self) -> Builder<'_> {

capnpc/src/codegen.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,15 +1093,19 @@ fn generate_setter(
10931093
)
10941094
}
10951095
type_::Data(()) => {
1096-
setter_interior.push(Line(format!(
1097-
"self.builder.reborrow().get_pointer_field({offset}).set_data(value);"
1096+
// The data::Reader impl of SetterInput never fails, so we can unwrap().
1097+
setter_interior.push(Line(fmt!(ctx,
1098+
"{capnp}::traits::SetterInput::set_pointer_builder(self.builder.reborrow().get_pointer_field({offset}), value, false).unwrap()"
10981099
)));
10991100
initter_interior.push(Line(format!(
11001101
"self.builder.get_pointer_field({offset}).init_data(size)"
11011102
)));
11021103
initter_params.push("size: u32");
11031104
(
1104-
Some(fmt!(ctx, "{capnp}::data::Reader<'_>")),
1105+
Some(fmt!(
1106+
ctx,
1107+
"impl {capnp}::traits::SetterInput<{capnp}::data::Owned>"
1108+
)),
11051109
Some(fmt!(ctx, "{capnp}::data::Builder<'a>")),
11061110
)
11071111
}
@@ -1176,7 +1180,11 @@ fn generate_setter(
11761180
Line(fmt!(ctx,"{capnp}::traits::SetterInput::set_pointer_builder(self.builder.reborrow().get_pointer_field({offset}), value, false)")));
11771181

11781182
(
1179-
Some(typ.type_string(ctx, Leaf::Reader("'_"))?),
1183+
Some(fmt!(
1184+
ctx,
1185+
"impl {capnp}::traits::SetterInput<{}>",
1186+
typ.type_string(ctx, Leaf::Owned)?
1187+
)),
11801188
Some(typ.type_string(ctx, Leaf::Builder("'a"))?),
11811189
)
11821190
}

capnpc/test/test.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1524,10 +1524,8 @@ mod tests {
15241524
.allocation_strategy(::capnp::message::AllocationStrategy::FixedSize);
15251525
let mut message2 = message::Builder::new(builder_options);
15261526
let mut all_types2 = message2.init_root::<test_all_types::Builder<'_>>();
1527-
1528-
all_types2
1529-
.set_struct_field(message.get_root_as_reader().unwrap())
1530-
.unwrap();
1527+
let root_reader: test_all_types::Reader<'_> = message.get_root_as_reader().unwrap();
1528+
all_types2.set_struct_field(root_reader).unwrap();
15311529
CheckTestMessage::check_test_message(all_types2.reborrow().get_struct_field().unwrap());
15321530

15331531
let reader = all_types2.into_reader().get_struct_field().unwrap();

0 commit comments

Comments
 (0)