miniserde/json/
number.rs

1use crate::de::{Deserialize, Visitor};
2use crate::error::Result;
3use crate::ser::{Fragment, Serialize};
4use core::fmt::{self, Display};
5
6/// A JSON number represented by some Rust primitive.
7#[derive(Clone, Debug)]
8pub enum Number {
9    U64(u64),
10    I64(i64),
11    F64(f64),
12}
13
14impl Display for Number {
15    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
16        match self {
17            Number::U64(n) => formatter.write_str(itoa::Buffer::new().format(*n)),
18            Number::I64(n) => formatter.write_str(itoa::Buffer::new().format(*n)),
19            Number::F64(n) => formatter.write_str(ryu::Buffer::new().format(*n)),
20        }
21    }
22}
23
24impl Serialize for Number {
25    fn begin(&self) -> Fragment {
26        match self {
27            Number::U64(n) => Fragment::U64(*n),
28            Number::I64(n) => Fragment::I64(*n),
29            Number::F64(n) => Fragment::F64(*n),
30        }
31    }
32}
33
34impl Deserialize for Number {
35    fn begin(out: &mut Option<Self>) -> &mut dyn Visitor {
36        make_place!(Place);
37
38        impl Visitor for Place<Number> {
39            fn negative(&mut self, n: i64) -> Result<()> {
40                self.out = Some(Number::I64(n));
41                Ok(())
42            }
43
44            fn nonnegative(&mut self, n: u64) -> Result<()> {
45                self.out = Some(Number::U64(n));
46                Ok(())
47            }
48
49            fn float(&mut self, n: f64) -> Result<()> {
50                self.out = Some(Number::F64(n));
51                Ok(())
52            }
53        }
54
55        Place::new(out)
56    }
57}