simd_json_derive/impls/
primitives.rs

1use crate::{de, Deserialize, Result, Serialize, Tape, Write};
2use std::convert::TryFrom;
3
4impl Serialize for bool {
5    #[inline]
6    fn json_write<W: Write>(&self, writer: &mut W) -> Result {
7        if *self {
8            writer.write_all(b"true")
9        } else {
10            writer.write_all(b"false")
11        }
12    }
13}
14
15impl<'input> Deserialize<'input> for bool {
16    #[inline]
17    fn from_tape(tape: &mut Tape<'input>) -> de::Result<bool> {
18        if let Some(simd_json::Node::Static(simd_json::StaticNode::Bool(r))) = tape.next() {
19            Ok(r)
20        } else {
21            Err(de::Error::expected_boolean())
22        }
23    }
24}
25
26macro_rules! itoa {
27    ($t:ty) => {
28        impl Serialize for $t {
29            #[inline]
30            fn json_write<W>(&self, writer: &mut W) -> std::io::Result<()>
31            where
32                W: Write,
33            {
34                let mut buffer = itoa::Buffer::new();
35                let s = buffer.format(*self);
36                writer.write_all(s.as_bytes())
37            }
38        }
39
40        impl<'input> Deserialize<'input> for $t {
41            #[inline]
42            fn from_tape(tape: &mut Tape<'input>) -> de::Result<Self>
43            where
44                Self: std::marker::Sized + 'input,
45            {
46                match tape.next() {
47                    Some(simd_json::Node::Static(simd_json::StaticNode::I64(i))) => {
48                        <$t>::try_from(i).map_err(de::Error::from)
49                    }
50                    Some(simd_json::Node::Static(simd_json::StaticNode::U64(i))) => {
51                        <$t>::try_from(i).map_err(de::Error::from)
52                    }
53                    #[cfg(feature = "128bit")]
54                    Some(simd_json::Node::Static(simd_json::StaticNode::U128(i))) => {
55                        <$t>::try_from(i).map_err(de::Error::from)
56                    }
57                    #[cfg(feature = "128bit")]
58                    Some(simd_json::Node::Static(simd_json::StaticNode::I128(i))) => {
59                        <$t>::try_from(i).map_err(de::Error::from)
60                    }
61                    _ => Err(de::Error::expected_integer()),
62                }
63            }
64        }
65    };
66}
67
68itoa!(i8);
69itoa!(u8);
70itoa!(i16);
71itoa!(u16);
72itoa!(i32);
73itoa!(u32);
74itoa!(i64);
75itoa!(u64);
76itoa!(usize);
77itoa!(i128);
78itoa!(u128);
79
80macro_rules! ryu {
81    ($t:ty) => {
82        impl Serialize for $t {
83            #[inline]
84            fn json_write<W>(&self, writer: &mut W) -> std::io::Result<()>
85            where
86                W: Write,
87            {
88                let mut buffer = ryu::Buffer::new();
89                let s = buffer.format_finite(*self);
90                writer.write_all(s.as_bytes())
91            }
92        }
93    };
94}
95ryu!(f64);
96ryu!(f32);
97
98impl<'input> Deserialize<'input> for f64 {
99    #[inline]
100    #[allow(clippy::cast_precision_loss)]
101    fn from_tape(tape: &mut Tape<'input>) -> de::Result<Self>
102    where
103        Self: Sized + 'input,
104    {
105        match tape.next() {
106            Some(simd_json::Node::Static(simd_json::StaticNode::F64(i))) => Ok(i),
107            Some(simd_json::Node::Static(simd_json::StaticNode::I64(i))) => Ok(i as f64),
108            Some(simd_json::Node::Static(simd_json::StaticNode::U64(i))) => Ok(i as f64),
109            #[cfg(feature = "128bit")]
110            Some(simd_json::Node::Static(simd_json::StaticNode::U128(i))) => Ok(i as f64),
111            #[cfg(feature = "128bit")]
112            Some(simd_json::Node::Static(simd_json::StaticNode::I128(i))) => Ok(i as f64),
113            _ => Err(de::Error::expected_float()),
114        }
115    }
116}
117
118impl<'input> Deserialize<'input> for f32 {
119    #[inline]
120    #[allow(clippy::cast_precision_loss, clippy::cast_possible_truncation)]
121    fn from_tape(tape: &mut Tape<'input>) -> de::Result<Self>
122    where
123        Self: Sized + 'input,
124    {
125        match tape.next() {
126            Some(simd_json::Node::Static(simd_json::StaticNode::F64(i))) => Ok(i as f32),
127            Some(simd_json::Node::Static(simd_json::StaticNode::I64(i))) => Ok(i as f32),
128            Some(simd_json::Node::Static(simd_json::StaticNode::U64(i))) => Ok(i as f32),
129            #[cfg(feature = "128bit")]
130            Some(simd_json::Node::Static(simd_json::StaticNode::U128(i))) => Ok(i as f32),
131            #[cfg(feature = "128bit")]
132            Some(simd_json::Node::Static(simd_json::StaticNode::I128(i))) => Ok(i as f32),
133            _ => Err(de::Error::expected_float()),
134        }
135    }
136}