reqrio_json/
number.rs

1use serde::{Serialize, Serializer};
2
3#[derive(Clone)]
4pub enum Number {
5    U8(u8),
6    U16(u16),
7    U32(u32),
8    U64(u64),
9    U128(u128),
10    Usize(usize),
11    I8(i8),
12    I16(i16),
13    I32(i32),
14    I64(i64),
15    I128(i128),
16    Isize(isize),
17    F32(f32),
18    F64(f64),
19}
20
21impl Number {
22    pub fn as_u8(&self) -> u8 {
23        match self {
24            Number::U8(v) => *v,
25            Number::U16(v) => *v as u8,
26            Number::U32(v) => *v as u8,
27            Number::U64(v) => *v as u8,
28            Number::U128(v) => *v as u8,
29            Number::Usize(v) => *v as u8,
30            Number::I8(v) => *v as u8,
31            Number::I16(v) => *v as u8,
32            Number::I32(v) => *v as u8,
33            Number::I64(v) => *v as u8,
34            Number::I128(v) => *v as u8,
35            Number::Isize(v) => *v as u8,
36            Number::F32(v) => *v as u8,
37            Number::F64(v) => *v as u8,
38        }
39    }
40
41    pub fn as_u16(&self) -> u16 {
42        match self {
43            Number::U8(v) => *v as u16,
44            Number::U16(v) => *v,
45            Number::U32(v) => *v as u16,
46            Number::U64(v) => *v as u16,
47            Number::U128(v) => *v as u16,
48            Number::Usize(v) => *v as u16,
49            Number::I8(v) => *v as u16,
50            Number::I16(v) => *v as u16,
51            Number::I32(v) => *v as u16,
52            Number::I64(v) => *v as u16,
53            Number::I128(v) => *v as u16,
54            Number::Isize(v) => *v as u16,
55            Number::F32(v) => *v as u16,
56            Number::F64(v) => *v as u16,
57        }
58    }
59
60    pub fn as_u32(&self) -> u32 {
61        match self {
62            Number::U8(v) => *v as u32,
63            Number::U16(v) => *v as u32,
64            Number::U32(v) => *v,
65            Number::U64(v) => *v as u32,
66            Number::U128(v) => *v as u32,
67            Number::Usize(v) => *v as u32,
68            Number::I8(v) => *v as u32,
69            Number::I16(v) => *v as u32,
70            Number::I32(v) => *v as u32,
71            Number::I64(v) => *v as u32,
72            Number::I128(v) => *v as u32,
73            Number::Isize(v) => *v as u32,
74            Number::F32(v) => *v as u32,
75            Number::F64(v) => *v as u32,
76        }
77    }
78
79    pub fn as_u64(&self) -> u64 {
80        match self {
81            Number::U8(v) => *v as u64,
82            Number::U16(v) => *v as u64,
83            Number::U32(v) => *v as u64,
84            Number::U64(v) => *v,
85            Number::U128(v) => *v as u64,
86            Number::Usize(v) => *v as u64,
87            Number::I8(v) => *v as u64,
88            Number::I16(v) => *v as u64,
89            Number::I32(v) => *v as u64,
90            Number::I64(v) => *v as u64,
91            Number::I128(v) => *v as u64,
92            Number::Isize(v) => *v as u64,
93            Number::F32(v) => *v as u64,
94            Number::F64(v) => *v as u64,
95        }
96    }
97
98    pub fn as_u128(&self) -> u128 {
99        match self {
100            Number::U8(v) => *v as u128,
101            Number::U16(v) => *v as u128,
102            Number::U32(v) => *v as u128,
103            Number::U64(v) => *v as u128,
104            Number::U128(v) => *v,
105            Number::Usize(v) => *v as u128,
106            Number::I8(v) => *v as u128,
107            Number::I16(v) => *v as u128,
108            Number::I32(v) => *v as u128,
109            Number::I64(v) => *v as u128,
110            Number::I128(v) => *v as u128,
111            Number::Isize(v) => *v as u128,
112            Number::F32(v) => *v as u128,
113            Number::F64(v) => *v as u128,
114        }
115    }
116
117    pub fn as_usize(&self) -> usize {
118        match self {
119            Number::U8(v) => *v as usize,
120            Number::U16(v) => *v as usize,
121            Number::U32(v) => *v as usize,
122            Number::U64(v) => *v as usize,
123            Number::U128(v) => *v as usize,
124            Number::Usize(v) => *v,
125            Number::I8(v) => *v as usize,
126            Number::I16(v) => *v as usize,
127            Number::I32(v) => *v as usize,
128            Number::I64(v) => *v as usize,
129            Number::I128(v) => *v as usize,
130            Number::Isize(v) => *v as usize,
131            Number::F32(v) => *v as usize,
132            Number::F64(v) => *v as usize,
133        }
134    }
135
136    pub fn as_i8(&self) -> i8 {
137        match self {
138            Number::U8(v) => *v as i8,
139            Number::U16(v) => *v as i8,
140            Number::U32(v) => *v as i8,
141            Number::U64(v) => *v as i8,
142            Number::U128(v) => *v as i8,
143            Number::Usize(v) => *v as i8,
144            Number::I8(v) => *v,
145            Number::I16(v) => *v as i8,
146            Number::I32(v) => *v as i8,
147            Number::I64(v) => *v as i8,
148            Number::I128(v) => *v as i8,
149            Number::Isize(v) => *v as i8,
150            Number::F32(v) => *v as i8,
151            Number::F64(v) => *v as i8,
152        }
153    }
154
155    pub fn as_i16(&self) -> i16 {
156        match self {
157            Number::U8(v) => *v as i16,
158            Number::U16(v) => *v as i16,
159            Number::U32(v) => *v as i16,
160            Number::U64(v) => *v as i16,
161            Number::U128(v) => *v as i16,
162            Number::Usize(v) => *v as i16,
163            Number::I8(v) => *v as i16,
164            Number::I16(v) => *v,
165            Number::I32(v) => *v as i16,
166            Number::I64(v) => *v as i16,
167            Number::I128(v) => *v as i16,
168            Number::Isize(v) => *v as i16,
169            Number::F32(v) => *v as i16,
170            Number::F64(v) => *v as i16,
171        }
172    }
173
174    pub fn as_i32(&self) -> i32 {
175        match self {
176            Number::U8(v) => *v as i32,
177            Number::U16(v) => *v as i32,
178            Number::U32(v) => *v as i32,
179            Number::U64(v) => *v as i32,
180            Number::U128(v) => *v as i32,
181            Number::Usize(v) => *v as i32,
182            Number::I8(v) => *v as i32,
183            Number::I16(v) => *v as i32,
184            Number::I32(v) => *v,
185            Number::I64(v) => *v as i32,
186            Number::I128(v) => *v as i32,
187            Number::Isize(v) => *v as i32,
188            Number::F32(v) => *v as i32,
189            Number::F64(v) => *v as i32,
190        }
191    }
192
193    pub fn as_i64(&self) -> i64 {
194        match self {
195            Number::U8(v) => *v as i64,
196            Number::U16(v) => *v as i64,
197            Number::U32(v) => *v as i64,
198            Number::U64(v) => *v as i64,
199            Number::U128(v) => *v as i64,
200            Number::Usize(v) => *v as i64,
201            Number::I8(v) => *v as i64,
202            Number::I16(v) => *v as i64,
203            Number::I32(v) => *v as i64,
204            Number::I64(v) => *v,
205            Number::I128(v) => *v as i64,
206            Number::Isize(v) => *v as i64,
207            Number::F32(v) => *v as i64,
208            Number::F64(v) => *v as i64,
209        }
210    }
211
212    pub fn as_i128(&self) -> i128 {
213        match self {
214            Number::U8(v) => *v as i128,
215            Number::U16(v) => *v as i128,
216            Number::U32(v) => *v as i128,
217            Number::U64(v) => *v as i128,
218            Number::U128(v) => *v as i128,
219            Number::Usize(v) => *v as i128,
220            Number::I8(v) => *v as i128,
221            Number::I16(v) => *v as i128,
222            Number::I32(v) => *v as i128,
223            Number::I64(v) => *v as i128,
224            Number::I128(v) => *v,
225            Number::Isize(v) => *v as i128,
226            Number::F32(v) => *v as i128,
227            Number::F64(v) => *v as i128,
228        }
229    }
230
231    pub fn as_isize(&self) -> isize {
232        match self {
233            Number::U8(v) => *v as isize,
234            Number::U16(v) => *v as isize,
235            Number::U32(v) => *v as isize,
236            Number::U64(v) => *v as isize,
237            Number::U128(v) => *v as isize,
238            Number::Usize(v) => *v as isize,
239            Number::I8(v) => *v as isize,
240            Number::I16(v) => *v as isize,
241            Number::I32(v) => *v as isize,
242            Number::I64(v) => *v as isize,
243            Number::I128(v) => *v as isize,
244            Number::Isize(v) => *v,
245            Number::F32(v) => *v as isize,
246            Number::F64(v) => *v as isize,
247        }
248    }
249
250    pub fn as_f32(&self) -> f32 {
251        match self {
252            Number::U8(v) => *v as f32,
253            Number::U16(v) => *v as f32,
254            Number::U32(v) => *v as f32,
255            Number::U64(v) => *v as f32,
256            Number::U128(v) => *v as f32,
257            Number::Usize(v) => *v as f32,
258            Number::I8(v) => *v as f32,
259            Number::I16(v) => *v as f32,
260            Number::I32(v) => *v as f32,
261            Number::I64(v) => *v as f32,
262            Number::I128(v) => *v as f32,
263            Number::Isize(v) => *v as f32,
264            Number::F32(v) => *v,
265            Number::F64(v) => *v as f32,
266        }
267    }
268
269    pub fn as_f64(&self) -> f64 {
270        match self {
271            Number::U8(v) => *v as f64,
272            Number::U16(v) => *v as f64,
273            Number::U32(v) => *v as f64,
274            Number::U64(v) => *v as f64,
275            Number::U128(v) => *v as f64,
276            Number::Usize(v) => *v as f64,
277            Number::I8(v) => *v as f64,
278            Number::I16(v) => *v as f64,
279            Number::I32(v) => *v as f64,
280            Number::I64(v) => *v as f64,
281            Number::I128(v) => *v as f64,
282            Number::Isize(v) => *v as f64,
283            Number::F32(v) => *v as f64,
284            Number::F64(v) => *v,
285        }
286    }
287}
288
289impl Serialize for Number {
290    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
291    where
292        S: Serializer,
293    {
294        match self {
295            Number::U8(v) => serializer.serialize_u8(*v),
296            Number::U16(v) => serializer.serialize_u16(*v),
297            Number::U32(v) => serializer.serialize_u32(*v),
298            Number::U64(v) => serializer.serialize_u64(*v),
299            Number::U128(v) => serializer.serialize_u128(*v),
300            Number::Usize(v) => serializer.serialize_u128(*v as u128),
301            Number::I8(v) => serializer.serialize_i8(*v),
302            Number::I16(v) => serializer.serialize_i16(*v),
303            Number::I32(v) => serializer.serialize_i32(*v),
304            Number::I64(v) => serializer.serialize_i64(*v),
305            Number::I128(v) => serializer.serialize_i128(*v),
306            Number::Isize(v) => serializer.serialize_i128(*v as i128),
307            Number::F32(v) => serializer.serialize_f32(*v),
308            Number::F64(v) => serializer.serialize_f64(*v),
309        }
310    }
311}
312
313
314impl TryFrom<serde_json::Number> for Number {
315    type Error = serde_json::Error;
316
317    fn try_from(number: serde_json::Number) -> Result<Self, Self::Error> {
318        if number.is_f64() {
319            Ok(Number::F64(number.as_f64().ok_or(serde::de::Error::custom("Invalid number"))?))
320        } else if number.is_i64() {
321            Ok(Number::I64(number.as_i64().ok_or(serde::de::Error::custom("Invalid number"))?))
322        } else {
323            Ok(Number::U64(number.as_u64().ok_or(serde::de::Error::custom("Invalid number"))?))
324        }
325    }
326}
327
328
329#[cfg(test)]
330mod tests {
331    use crate::number::Number;
332
333    #[test]
334    fn test_number() {
335        let n = Number::I32(4);
336        println!("{}", serde_json::to_string_pretty(&n).unwrap());
337        // let k: Number = serde_json::from_value(serde_json::Value::Number(serde_json::Number::from(4))).unwrap();
338        // println!("{}", serde_json::to_string_pretty(&k).unwrap());
339    }
340}