simd_json_derive/impls/
primitives.rs1use 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}