diff --git a/implementations/rust/src/value/de.rs b/implementations/rust/src/value/de.rs index 0049559..239f463 100644 --- a/implementations/rust/src/value/de.rs +++ b/implementations/rust/src/value/de.rs @@ -118,12 +118,18 @@ impl<'de, 'a> serde::de::Deserializer<'de> for &'a mut Deserializer<'de> fn deserialize_f32(self, visitor: V) -> Result 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(self, visitor: V) -> Result 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(self, visitor: V) -> Result where V: Visitor<'de> diff --git a/implementations/rust/src/value/reader.rs b/implementations/rust/src/value/reader.rs index a1c6a24..e3e0ddf 100644 --- a/implementations/rust/src/value/reader.rs +++ b/implementations/rust/src/value/reader.rs @@ -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 { 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)?;