summaryrefslogtreecommitdiffstats
path: root/third_party/rust/serde/src/de/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/serde/src/de/mod.rs')
-rw-r--r--third_party/rust/serde/src/de/mod.rs61
1 files changed, 47 insertions, 14 deletions
diff --git a/third_party/rust/serde/src/de/mod.rs b/third_party/rust/serde/src/de/mod.rs
index c9919d92b8..1924fe3d88 100644
--- a/third_party/rust/serde/src/de/mod.rs
+++ b/third_party/rust/serde/src/de/mod.rs
@@ -402,20 +402,20 @@ impl<'a> fmt::Display for Unexpected<'a> {
Bool(b) => write!(formatter, "boolean `{}`", b),
Unsigned(i) => write!(formatter, "integer `{}`", i),
Signed(i) => write!(formatter, "integer `{}`", i),
- Float(f) => write!(formatter, "floating point `{}`", f),
+ Float(f) => write!(formatter, "floating point `{}`", WithDecimalPoint(f)),
Char(c) => write!(formatter, "character `{}`", c),
Str(s) => write!(formatter, "string {:?}", s),
- Bytes(_) => write!(formatter, "byte array"),
- Unit => write!(formatter, "unit value"),
- Option => write!(formatter, "Option value"),
- NewtypeStruct => write!(formatter, "newtype struct"),
- Seq => write!(formatter, "sequence"),
- Map => write!(formatter, "map"),
- Enum => write!(formatter, "enum"),
- UnitVariant => write!(formatter, "unit variant"),
- NewtypeVariant => write!(formatter, "newtype variant"),
- TupleVariant => write!(formatter, "tuple variant"),
- StructVariant => write!(formatter, "struct variant"),
+ Bytes(_) => formatter.write_str("byte array"),
+ Unit => formatter.write_str("unit value"),
+ Option => formatter.write_str("Option value"),
+ NewtypeStruct => formatter.write_str("newtype struct"),
+ Seq => formatter.write_str("sequence"),
+ Map => formatter.write_str("map"),
+ Enum => formatter.write_str("enum"),
+ UnitVariant => formatter.write_str("unit variant"),
+ NewtypeVariant => formatter.write_str("newtype variant"),
+ TupleVariant => formatter.write_str("tuple variant"),
+ StructVariant => formatter.write_str("struct variant"),
Other(other) => formatter.write_str(other),
}
}
@@ -2278,10 +2278,10 @@ impl Display for OneOf {
1 => write!(formatter, "`{}`", self.names[0]),
2 => write!(formatter, "`{}` or `{}`", self.names[0], self.names[1]),
_ => {
- tri!(write!(formatter, "one of "));
+ tri!(formatter.write_str("one of "));
for (i, alt) in self.names.iter().enumerate() {
if i > 0 {
- tri!(write!(formatter, ", "));
+ tri!(formatter.write_str(", "));
}
tri!(write!(formatter, "`{}`", alt));
}
@@ -2290,3 +2290,36 @@ impl Display for OneOf {
}
}
}
+
+struct WithDecimalPoint(f64);
+
+impl Display for WithDecimalPoint {
+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+ struct LookForDecimalPoint<'f, 'a> {
+ formatter: &'f mut fmt::Formatter<'a>,
+ has_decimal_point: bool,
+ }
+
+ impl<'f, 'a> fmt::Write for LookForDecimalPoint<'f, 'a> {
+ fn write_str(&mut self, fragment: &str) -> fmt::Result {
+ self.has_decimal_point |= fragment.contains('.');
+ self.formatter.write_str(fragment)
+ }
+
+ fn write_char(&mut self, ch: char) -> fmt::Result {
+ self.has_decimal_point |= ch == '.';
+ self.formatter.write_char(ch)
+ }
+ }
+
+ let mut writer = LookForDecimalPoint {
+ formatter,
+ has_decimal_point: false,
+ };
+ tri!(write!(writer, "{}", self.0));
+ if !writer.has_decimal_point {
+ tri!(formatter.write_str(".0"));
+ }
+ Ok(())
+ }
+}