tiny_json_rs/serializer/
deserializers.rs

1use crate::mapper::Value;
2use crate::serializer::{DecodeError, Deserialize};
3use alloc::boxed::Box;
4use alloc::format;
5use alloc::string::String;
6use alloc::vec::Vec;
7use core::str::FromStr;
8
9pub fn parse_token<T>(value: Option<&Value>) -> Result<T, DecodeError>
10where
11    T: FromStr,
12{
13    let value = match value {
14        None => {
15            return Err(DecodeError::ParseError(format!(
16                "Could not parse {} to {}",
17                "None",
18                core::any::type_name::<T>()
19            )))
20        }
21        Some(v) => v,
22    };
23
24    let token = match value {
25        Value::Token(t) => t,
26        _ => return Err(DecodeError::UnexpectedType),
27    };
28
29    return token.to::<T>();
30}
31
32impl Deserialize for u8 {
33    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
34        parse_token(value)
35    }
36}
37
38impl Deserialize for u16 {
39    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
40        parse_token(value)
41    }
42}
43
44impl Deserialize for u32 {
45    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
46        parse_token(value)
47    }
48}
49
50impl Deserialize for u64 {
51    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
52        parse_token(value)
53    }
54}
55
56impl Deserialize for usize {
57    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
58        parse_token(value)
59    }
60}
61
62impl Deserialize for i8 {
63    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
64        parse_token(value)
65    }
66}
67
68impl Deserialize for i16 {
69    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
70        parse_token(value)
71    }
72}
73
74impl Deserialize for i32 {
75    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
76        parse_token(value)
77    }
78}
79
80impl Deserialize for i64 {
81    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
82        parse_token(value)
83    }
84}
85
86impl Deserialize for isize {
87    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
88        parse_token(value)
89    }
90}
91
92impl Deserialize for f32 {
93    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
94        parse_token(value)
95    }
96}
97
98impl Deserialize for f64 {
99    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
100        parse_token(value)
101    }
102}
103
104impl Deserialize for bool {
105    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
106        parse_token(value)
107    }
108}
109
110impl Deserialize for char {
111    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
112        parse_token(value)
113    }
114}
115
116impl Deserialize for String {
117    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
118        parse_token(value)
119    }
120}
121
122impl<T> Deserialize for Option<T>
123where
124    T: Deserialize,
125{
126    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
127        match value {
128            None => Ok(None),
129            Some(v) => {
130                let res = T::deserialize(Some(v))?;
131                Ok(Some(res))
132            }
133        }
134    }
135}
136
137impl<T> Deserialize for Box<T>
138where
139    T: Deserialize,
140{
141    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
142        let res = T::deserialize(value)?;
143        Ok(Box::new(res))
144    }
145}
146
147impl<T> Deserialize for Vec<T>
148where
149    T: Deserialize,
150{
151    fn deserialize(value: Option<&Value>) -> Result<Self, DecodeError> {
152        let value = match value {
153            None => return Ok(Vec::new()),
154            Some(v) => v,
155        };
156        match value {
157            Value::Array(array) => {
158                let mut vec = Vec::new();
159                for item in array {
160                    let res = T::deserialize(Some(item))?;
161                    vec.push(res);
162                }
163                Ok(vec)
164            }
165            _ => Err(DecodeError::UnexpectedType),
166        }
167    }
168}