re-use inner serde impls for Wrapping types

This commit is contained in:
Shane Pearman 2020-02-01 03:01:11 -08:00
parent 7aa5b0844f
commit b0e3828e79
1 changed files with 2 additions and 40 deletions

View File

@ -36,10 +36,7 @@ macro_rules! serde_fixed {
}
impl<Frac: $LeEqU> Serialize for Wrapping<$Fixed<Frac>> {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let bits = self.to_bits();
let mut state = serializer.serialize_struct($Name, 1)?;
state.serialize_field("bits", &bits)?;
state.end()
self.0.serialize(serializer)
}
}
@ -86,42 +83,7 @@ macro_rules! serde_fixed {
impl<'de, Frac: $LeEqU> Deserialize<'de> for Wrapping<$Fixed<Frac>> {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
struct FixedVisitor;
impl<'de> Visitor<'de> for FixedVisitor {
type Value = $TBits;
fn expecting(&self, formatter: &mut Formatter) -> FmtResult {
formatter.write_str("struct ")?;
formatter.write_str($Name)
}
fn visit_seq<V: SeqAccess<'de>>(self, mut seq: V) -> Result<$TBits, V::Error> {
let bits = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(0, &self))?;
Ok(bits)
}
fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<$TBits, V::Error> {
let mut bits = None;
while let Some(key) = map.next_key()? {
match key {
Field::Bits => {
if bits.is_some() {
return Err(de::Error::duplicate_field("bits"));
}
bits = Some(map.next_value()?);
}
}
}
let bits = bits.ok_or_else(|| de::Error::missing_field("bits"))?;
Ok(bits)
}
}
let bits = deserializer.deserialize_struct($Name, FIELDS, FixedVisitor)?;
Ok(Wrapping($Fixed::from_bits(bits)))
$Fixed::deserialize(deserializer).map(Wrapping)
}
}
};