tiny_json_rs/serializer/
deserializers.rs1use 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}