diff options
Diffstat (limited to 'src/ser/value.rs')
-rw-r--r-- | src/ser/value.rs | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/src/ser/value.rs b/src/ser/value.rs index d29390a..47a17a3 100644 --- a/src/ser/value.rs +++ b/src/ser/value.rs @@ -60,10 +60,10 @@ impl serde::ser::Serializer for ValueSerializer { type SerializeSeq = super::SerializeValueArray; type SerializeTuple = super::SerializeValueArray; type SerializeTupleStruct = super::SerializeValueArray; - type SerializeTupleVariant = super::SerializeValueArray; + type SerializeTupleVariant = super::SerializeTupleVariant; type SerializeMap = super::SerializeMap; type SerializeStruct = super::SerializeMap; - type SerializeStructVariant = serde::ser::Impossible<Self::Ok, Self::Error>; + type SerializeStructVariant = super::SerializeStructVariant; fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> { Ok(v.into()) @@ -108,7 +108,17 @@ impl serde::ser::Serializer for ValueSerializer { self.serialize_f64(v as f64) } - fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> { + fn serialize_f64(self, mut v: f64) -> Result<Self::Ok, Self::Error> { + // Discard sign of NaN when serialized using Serde. + // + // In all likelihood the sign of NaNs is not meaningful in the user's + // program. Ending up with `-nan` in the TOML document would usually be + // surprising and undesirable, when the sign of the NaN was not + // intentionally controlled by the caller, or may even be + // nondeterministic if it comes from arithmetic operations or a cast. + if v.is_nan() { + v = v.copysign(1.0); + } Ok(v.into()) } @@ -205,10 +215,10 @@ impl serde::ser::Serializer for ValueSerializer { self, _name: &'static str, _variant_index: u32, - _variant: &'static str, + variant: &'static str, len: usize, ) -> Result<Self::SerializeTupleVariant, Self::Error> { - self.serialize_seq(Some(len)) + Ok(super::SerializeTupleVariant::tuple(variant, len)) } fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> { @@ -233,11 +243,11 @@ impl serde::ser::Serializer for ValueSerializer { fn serialize_struct_variant( self, - name: &'static str, + _name: &'static str, _variant_index: u32, - _variant: &'static str, - _len: usize, + variant: &'static str, + len: usize, ) -> Result<Self::SerializeStructVariant, Self::Error> { - Err(Error::UnsupportedType(Some(name))) + Ok(super::SerializeStructVariant::struct_(variant, len)) } } |