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 }
340}