Skip to content

Commit 7da33fe

Browse files
emonadeohw0lff1Dudemoehr1z
committed
feat: Value representation of Simple values
Co-authored-by: Hendrik Wolff <[email protected]> Co-authored-by: Theodor Straube <[email protected]> Co-authored-by: moehr1z <[email protected]> Signed-off-by: Emanuel Pilz <[email protected]>
1 parent 5ab0ccd commit 7da33fe

File tree

11 files changed

+669
-76
lines changed

11 files changed

+669
-76
lines changed

ciborium/src/de/mod.rs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -213,25 +213,22 @@ where
213213
Header::Simple(simple::FALSE) => self.deserialize_bool(visitor),
214214
Header::Simple(simple::TRUE) => self.deserialize_bool(visitor),
215215
Header::Simple(simple::NULL) => self.deserialize_option(visitor),
216-
Header::Simple(simple::UNDEFINED) => self.deserialize_option(visitor),
217-
h @ Header::Simple(..) => Err(h.expected("known simple value")),
216+
Header::Simple(_) => self.recurse(|me| {
217+
let mut simple_de =
218+
crate::simple::SimpleDeserializer::<_, Self>::new(&mut me.decoder);
219+
visitor.visit_newtype_struct(&mut simple_de)
220+
}),
218221

219222
h @ Header::Break => Err(h.expected("non-break")),
220223
}
221224
}
222225

223226
#[inline]
224227
fn deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
225-
loop {
226-
let offset = self.decoder.offset();
227-
228-
return match self.decoder.pull()? {
229-
Header::Tag(..) => continue,
230-
Header::Simple(simple::FALSE) => visitor.visit_bool(false),
231-
Header::Simple(simple::TRUE) => visitor.visit_bool(true),
232-
_ => Err(Error::semantic(offset, "expected bool")),
233-
};
234-
}
228+
self.recurse(|me| {
229+
let mut simple_de = crate::simple::SimpleDeserializer::<_, Self>::new(&mut me.decoder);
230+
simple_de.deserialize_bool(visitor)
231+
})
235232
}
236233

237234
#[inline]

ciborium/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ extern crate alloc;
9494

9595
pub mod de;
9696
pub mod ser;
97+
pub mod simple;
9798
pub mod tag;
9899
pub mod value;
99100

ciborium/src/ser/mod.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,16 @@ where
200200
#[inline]
201201
fn serialize_newtype_struct<U: ?Sized + ser::Serialize>(
202202
self,
203-
_name: &'static str,
203+
name: &'static str,
204204
value: &U,
205205
) -> Result<(), Self::Error> {
206-
value.serialize(self)
206+
match name {
207+
"@@SIMPLE@@" => match value.serialize(crate::simple::Serializer) {
208+
Ok(x) => Ok(self.0.push(Header::Simple(x))?),
209+
_ => Err(Error::Value("expected simple value".into())),
210+
},
211+
_ => value.serialize(self),
212+
}
207213
}
208214

209215
#[inline]

0 commit comments

Comments
 (0)