Allow f32 and f64 to deserialize into each other

This commit is contained in:
Tony Garnock-Jones 2020-05-29 10:58:00 +02:00
parent 0788edaaed
commit d1a5389060
2 changed files with 18 additions and 2 deletions

View File

@ -118,12 +118,18 @@ impl<'de, 'a> serde::de::Deserializer<'de> for &'a mut Deserializer<'de>
fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value> where V: Visitor<'de>
{
visitor.visit_f32(self.input.value().to_float()?)
match self.input.value().as_double() {
Some(d) => visitor.visit_f32(d as f32),
None => visitor.visit_f32(self.input.value().to_float()?),
}
}
fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value> where V: Visitor<'de>
{
visitor.visit_f64(self.input.value().to_double()?)
match self.input.value().as_float() {
Some(f) => visitor.visit_f64(f as f64),
None => visitor.visit_f64(self.input.value().to_double()?),
}
}
fn deserialize_char<V>(self, visitor: V) -> Result<V::Value> where V: Visitor<'de>

View File

@ -701,12 +701,22 @@ impl<'de, S: BinarySource<'de>> Reader<'de> for BinaryReader<'de, S> {
let bs: &[u8] = &self.readbytes(4)?;
Ok(f32::from_bits(u32::from_be_bytes(bs.try_into().unwrap())))
},
(Op::Misc(0), 3) => {
self.skip()?;
let bs: &[u8] = &self.readbytes(8)?;
Ok(f64::from_bits(u64::from_be_bytes(bs.try_into().unwrap())) as f32)
},
_ => Err(self.expected(ExpectedKind::Float)),
}
}
fn next_double(&mut self) -> ReaderResult<f64> {
match self.peek_next_nonannotation_op()? {
(Op::Misc(0), 2) => {
self.skip()?;
let bs: &[u8] = &self.readbytes(4)?;
Ok(f32::from_bits(u32::from_be_bytes(bs.try_into().unwrap())) as f64)
},
(Op::Misc(0), 3) => {
self.skip()?;
let bs: &[u8] = &self.readbytes(8)?;