1use crate::de::{Deserialize, Visitor};
2use crate::error::Result;
3use crate::ser::{Fragment, Serialize};
4use core::fmt::{self, Display};
5
6#[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}