simd_json_derive/impls/
tpl.rs

1use crate::{de, Deserialize, Result, Serialize, Tape, Write};
2
3impl Serialize for () {
4    #[inline]
5    fn json_write<W>(&self, writer: &mut W) -> Result
6    where
7        W: Write,
8    {
9        writer.write_all(b"null")
10    }
11}
12
13impl<'input> Deserialize<'input> for () {
14    #[inline]
15    fn from_tape(tape: &mut Tape<'input>) -> de::Result<Self>
16    where
17        Self: std::marker::Sized + 'input,
18    {
19        if let Some(simd_json::Node::Static(simd_json::StaticNode::Null)) = tape.next() {
20            Ok(())
21        } else {
22            Err(de::Error::expected_null())
23        }
24    }
25}
26
27// takenn from https://docs.serde.rs/src/serde/ser/impls.rs.html#306
28
29macro_rules! tuple_impls {
30    ($($len:expr => ($($n:tt $name:ident)+))+) => {
31        $(
32            impl<$($name),+> Serialize for ($($name,)+)
33            where
34                $($name: Serialize,)+
35            {
36                #[inline]
37                fn json_write<W>(&self, writer: &mut W) -> Result
38                where
39                    W: Write,
40                {
41                    writer.write_all(b"[")?;
42                    $(
43                        if $n != 0 {
44                            writer.write_all(b",")?;
45                        }
46                        self.$n.json_write(writer)?;
47                    )+
48                    writer.write_all(b"]")
49                }
50            }
51            impl<'input, $($name),+> Deserialize<'input> for ($($name,)+)
52            where
53                $($name: Deserialize<'input>,)+
54            {
55                #[inline]
56                fn from_tape(tape: &mut Tape<'input>) -> de::Result<Self>
57                where
58                    Self: std::marker::Sized + 'input,
59                {
60                    if let Some(simd_json::Node::Array{len: $len, ..}) = tape.next() {
61                        Ok((
62                            $($name::from_tape(tape)?,)+
63                        ))
64                    } else {
65                        Err(de::Error::expected_array())
66                    }
67                }
68            }
69        )+
70    }
71}
72
73tuple_impls! {
74    1 => (0 T0)
75    2 => (0 T0 1 T1)
76    3 => (0 T0 1 T1 2 T2)
77    4 => (0 T0 1 T1 2 T2 3 T3)
78    5 => (0 T0 1 T1 2 T2 3 T3 4 T4)
79    6 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5)
80    7 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6)
81    8 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7)
82    9 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8)
83    10 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9)
84    11 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10)
85    12 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11)
86    13 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12)
87    14 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13)
88    15 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14)
89    16 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15)
90}
91
92#[cfg(test)]
93mod test {
94    use crate::*;
95
96    #[test]
97    fn tpl() {
98        assert_eq!((1).json_string().expect("invalid test data"), "1");
99        assert_eq!((1, 2).json_string().expect("invalid test data"), "[1,2]");
100        assert_eq!(
101            (1, 2, 3).json_string().expect("invalid test data"),
102            "[1,2,3]"
103        );
104    }
105}