rof_rs/object_format/data_value/
integer.rs

1use crate::object_format::property::property_type::PropertyType;
2
3use super::super::DataValue;
4
5// Integer
6
7#[derive(Clone, Debug)]
8pub enum DataValueInteger {
9    U8(u8),
10    I8(i8),
11    U16(u16),
12    I16(i16),
13    U32(u32),
14    I32(i32),
15    U64(u64),
16    I64(i64),
17    U128(u128),
18    I128(i128),
19    USIZE(usize),
20    ISIZE(isize),
21}
22
23impl DataValue for DataValueInteger {
24    fn serialize(&self, _: bool, _: usize) -> (PropertyType, String) {
25        match self {
26            Self::U8(inner) => (PropertyType::simple(String::from("u8")), inner.to_string()),
27            Self::I8(inner) => (PropertyType::simple(String::from("i8")), inner.to_string()),
28
29            Self::U16(inner) => (PropertyType::simple(String::from("u16")), inner.to_string()),
30            Self::I16(inner) => (PropertyType::simple(String::from("i16")), inner.to_string()),
31
32            Self::U32(inner) => (PropertyType::simple(String::from("u32")), inner.to_string()),
33            Self::I32(inner) => (PropertyType::simple(String::from("i32")), inner.to_string()),
34
35            Self::U64(inner) => (PropertyType::simple(String::from("u64")), inner.to_string()),
36            Self::I64(inner) => (PropertyType::simple(String::from("i64")), inner.to_string()),
37
38            Self::U128(inner) => (
39                PropertyType::simple(String::from("u128")),
40                inner.to_string(),
41            ),
42            Self::I128(inner) => (
43                PropertyType::simple(String::from("i128")),
44                inner.to_string(),
45            ),
46
47            Self::USIZE(inner) => (
48                PropertyType::simple(String::from("usize")),
49                inner.to_string(),
50            ),
51            Self::ISIZE(inner) => (
52                PropertyType::simple(String::from("isize")),
53                inner.to_string(),
54            ),
55        }
56    }
57
58    fn deserialize(
59        serialized_type: &crate::object_format::property::property_type::PropertyType,
60        serialized_value: &str,
61    ) -> Option<Box<dyn DataValue>>
62    where
63        Self: Sized,
64    {
65        if serialized_type.sub_types_included() {
66            return None;
67        }
68
69        match serialized_type.get_base_type() {
70            "u8" => {
71                if let Ok(parsed_int) = serialized_value.parse::<u8>() {
72                    return Some(Box::new(Self::U8(parsed_int)));
73                } else {
74                    return None;
75                }
76            }
77            "i8" => {
78                if let Ok(parsed_int) = serialized_value.parse::<i8>() {
79                    return Some(Box::new(Self::I8(parsed_int)));
80                } else {
81                    return None;
82                }
83            }
84
85            "u16" => {
86                if let Ok(parsed_int) = serialized_value.parse::<u16>() {
87                    return Some(Box::new(Self::U16(parsed_int)));
88                } else {
89                    return None;
90                }
91            }
92            "i16" => {
93                if let Ok(parsed_int) = serialized_value.parse::<i16>() {
94                    return Some(Box::new(Self::I16(parsed_int)));
95                } else {
96                    return None;
97                }
98            }
99
100            "u32" => {
101                if let Ok(parsed_int) = serialized_value.parse::<u32>() {
102                    return Some(Box::new(Self::U32(parsed_int)));
103                } else {
104                    return None;
105                }
106            }
107            "i32" => {
108                if let Ok(parsed_int) = serialized_value.parse::<i32>() {
109                    return Some(Box::new(Self::I32(parsed_int)));
110                } else {
111                    return None;
112                }
113            }
114
115            "u64" => {
116                if let Ok(parsed_int) = serialized_value.parse::<u64>() {
117                    return Some(Box::new(Self::U64(parsed_int)));
118                } else {
119                    return None;
120                }
121            }
122            "i64" => {
123                if let Ok(parsed_int) = serialized_value.parse::<i64>() {
124                    return Some(Box::new(Self::I64(parsed_int)));
125                } else {
126                    return None;
127                }
128            }
129
130            "u128" => {
131                if let Ok(parsed_int) = serialized_value.parse::<u128>() {
132                    return Some(Box::new(Self::U128(parsed_int)));
133                } else {
134                    return None;
135                }
136            }
137            "i128" => {
138                if let Ok(parsed_int) = serialized_value.parse::<i128>() {
139                    return Some(Box::new(Self::I128(parsed_int)));
140                } else {
141                    return None;
142                }
143            }
144
145            "usize" => {
146                if let Ok(parsed_int) = serialized_value.parse::<usize>() {
147                    return Some(Box::new(Self::USIZE(parsed_int)));
148                } else {
149                    return None;
150                }
151            }
152            "isize" => {
153                if let Ok(parsed_int) = serialized_value.parse::<isize>() {
154                    return Some(Box::new(Self::ISIZE(parsed_int)));
155                } else {
156                    return None;
157                }
158            }
159
160            _ => None,
161        }
162    }
163
164    fn clone_data_value(&self) -> Box<dyn DataValue> {
165        Box::new(match self {
166            Self::U8(value) => Self::U8(value.clone()),
167            Self::I8(value) => Self::I8(value.clone()),
168
169            Self::U16(value) => Self::U16(value.clone()),
170            Self::I16(value) => Self::I16(value.clone()),
171
172            Self::U32(value) => Self::U32(value.clone()),
173            Self::I32(value) => Self::I32(value.clone()),
174
175            Self::U64(value) => Self::U64(value.clone()),
176            Self::I64(value) => Self::I64(value.clone()),
177
178            Self::U128(value) => Self::U128(value.clone()),
179            Self::I128(value) => Self::I128(value.clone()),
180
181            Self::USIZE(value) => Self::USIZE(value.clone()),
182            Self::ISIZE(value) => Self::ISIZE(value.clone()),
183        })
184    }
185
186    // TODO: Number conversions
187
188    fn as_f32(&self) -> f32 {
189        match self {
190            Self::U8(inner) => *inner as f32,
191            Self::I8(inner) => *inner as f32,
192            Self::U16(inner) => *inner as f32,
193            Self::I16(inner) => *inner as f32,
194            Self::U32(inner) => *inner as f32,
195            Self::I32(inner) => *inner as f32,
196            Self::U64(inner) => *inner as f32,
197            Self::I64(inner) => *inner as f32,
198            Self::U128(inner) => *inner as f32,
199            Self::I128(inner) => *inner as f32,
200            Self::USIZE(inner) => *inner as f32,
201            Self::ISIZE(inner) => *inner as f32,
202        }
203    }
204
205    fn as_f64(&self) -> f64 {
206        match self {
207            Self::U8(inner) => *inner as f64,
208            Self::I8(inner) => *inner as f64,
209            Self::U16(inner) => *inner as f64,
210            Self::I16(inner) => *inner as f64,
211            Self::U32(inner) => *inner as f64,
212            Self::I32(inner) => *inner as f64,
213            Self::U64(inner) => *inner as f64,
214            Self::I64(inner) => *inner as f64,
215            Self::U128(inner) => *inner as f64,
216            Self::I128(inner) => *inner as f64,
217            Self::USIZE(inner) => *inner as f64,
218            Self::ISIZE(inner) => *inner as f64,
219        }
220    }
221
222    fn as_u8(&self) -> u8 {
223        match self {
224            Self::U8(inner) => *inner,
225            Self::I8(inner) => *inner as u8,
226            Self::U16(inner) => *inner as u8,
227            Self::I16(inner) => *inner as u8,
228            Self::U32(inner) => *inner as u8,
229            Self::I32(inner) => *inner as u8,
230            Self::U64(inner) => *inner as u8,
231            Self::I64(inner) => *inner as u8,
232            Self::U128(inner) => *inner as u8,
233            Self::I128(inner) => *inner as u8,
234            Self::USIZE(inner) => *inner as u8,
235            Self::ISIZE(inner) => *inner as u8,
236        }
237    }
238
239    fn as_i8(&self) -> i8 {
240        match self {
241            Self::U8(inner) => *inner as i8,
242            Self::I8(inner) => *inner,
243            Self::U16(inner) => *inner as i8,
244            Self::I16(inner) => *inner as i8,
245            Self::U32(inner) => *inner as i8,
246            Self::I32(inner) => *inner as i8,
247            Self::U64(inner) => *inner as i8,
248            Self::I64(inner) => *inner as i8,
249            Self::U128(inner) => *inner as i8,
250            Self::I128(inner) => *inner as i8,
251            Self::USIZE(inner) => *inner as i8,
252            Self::ISIZE(inner) => *inner as i8,
253        }
254    }
255
256    fn as_u16(&self) -> u16 {
257        match self {
258            Self::U8(inner) => *inner as u16,
259            Self::I8(inner) => *inner as u16,
260            Self::U16(inner) => *inner,
261            Self::I16(inner) => *inner as u16,
262            Self::U32(inner) => *inner as u16,
263            Self::I32(inner) => *inner as u16,
264            Self::U64(inner) => *inner as u16,
265            Self::I64(inner) => *inner as u16,
266            Self::U128(inner) => *inner as u16,
267            Self::I128(inner) => *inner as u16,
268            Self::USIZE(inner) => *inner as u16,
269            Self::ISIZE(inner) => *inner as u16,
270        }
271    }
272
273    fn as_i16(&self) -> i16 {
274        match self {
275            Self::U8(inner) => *inner as i16,
276            Self::I8(inner) => *inner as i16,
277            Self::U16(inner) => *inner as i16,
278            Self::I16(inner) => *inner,
279            Self::U32(inner) => *inner as i16,
280            Self::I32(inner) => *inner as i16,
281            Self::U64(inner) => *inner as i16,
282            Self::I64(inner) => *inner as i16,
283            Self::U128(inner) => *inner as i16,
284            Self::I128(inner) => *inner as i16,
285            Self::USIZE(inner) => *inner as i16,
286            Self::ISIZE(inner) => *inner as i16,
287        }
288    }
289
290    fn as_u32(&self) -> u32 {
291        match self {
292            Self::U8(inner) => *inner as u32,
293            Self::I8(inner) => *inner as u32,
294            Self::U16(inner) => *inner as u32,
295            Self::I16(inner) => *inner as u32,
296            Self::U32(inner) => *inner,
297            Self::I32(inner) => *inner as u32,
298            Self::U64(inner) => *inner as u32,
299            Self::I64(inner) => *inner as u32,
300            Self::U128(inner) => *inner as u32,
301            Self::I128(inner) => *inner as u32,
302            Self::USIZE(inner) => *inner as u32,
303            Self::ISIZE(inner) => *inner as u32,
304        }
305    }
306
307    fn as_i32(&self) -> i32 {
308        match self {
309            Self::U8(inner) => *inner as i32,
310            Self::I8(inner) => *inner as i32,
311            Self::U16(inner) => *inner as i32,
312            Self::I16(inner) => *inner as i32,
313            Self::U32(inner) => *inner as i32,
314            Self::I32(inner) => *inner,
315            Self::U64(inner) => *inner as i32,
316            Self::I64(inner) => *inner as i32,
317            Self::U128(inner) => *inner as i32,
318            Self::I128(inner) => *inner as i32,
319            Self::USIZE(inner) => *inner as i32,
320            Self::ISIZE(inner) => *inner as i32,
321        }
322    }
323
324    fn as_u64(&self) -> u64 {
325        match self {
326            Self::U8(inner) => *inner as u64,
327            Self::I8(inner) => *inner as u64,
328            Self::U16(inner) => *inner as u64,
329            Self::I16(inner) => *inner as u64,
330            Self::U32(inner) => *inner as u64,
331            Self::I32(inner) => *inner as u64,
332            Self::U64(inner) => *inner,
333            Self::I64(inner) => *inner as u64,
334            Self::U128(inner) => *inner as u64,
335            Self::I128(inner) => *inner as u64,
336            Self::USIZE(inner) => *inner as u64,
337            Self::ISIZE(inner) => *inner as u64,
338        }
339    }
340
341    fn as_i64(&self) -> i64 {
342        match self {
343            Self::U8(inner) => *inner as i64,
344            Self::I8(inner) => *inner as i64,
345            Self::U16(inner) => *inner as i64,
346            Self::I16(inner) => *inner as i64,
347            Self::U32(inner) => *inner as i64,
348            Self::I32(inner) => *inner as i64,
349            Self::U64(inner) => *inner as i64,
350            Self::I64(inner) => *inner,
351            Self::U128(inner) => *inner as i64,
352            Self::I128(inner) => *inner as i64,
353            Self::USIZE(inner) => *inner as i64,
354            Self::ISIZE(inner) => *inner as i64,
355        }
356    }
357
358    fn as_u128(&self) -> u128 {
359        match self {
360            Self::U8(inner) => *inner as u128,
361            Self::I8(inner) => *inner as u128,
362            Self::U16(inner) => *inner as u128,
363            Self::I16(inner) => *inner as u128,
364            Self::U32(inner) => *inner as u128,
365            Self::I32(inner) => *inner as u128,
366            Self::U64(inner) => *inner as u128,
367            Self::I64(inner) => *inner as u128,
368            Self::U128(inner) => *inner,
369            Self::I128(inner) => *inner as u128,
370            Self::USIZE(inner) => *inner as u128,
371            Self::ISIZE(inner) => *inner as u128,
372        }
373    }
374
375    fn as_i128(&self) -> i128 {
376        match self {
377            Self::U8(inner) => *inner as i128,
378            Self::I8(inner) => *inner as i128,
379            Self::U16(inner) => *inner as i128,
380            Self::I16(inner) => *inner as i128,
381            Self::U32(inner) => *inner as i128,
382            Self::I32(inner) => *inner as i128,
383            Self::U64(inner) => *inner as i128,
384            Self::I64(inner) => *inner as i128,
385            Self::U128(inner) => *inner as i128,
386            Self::I128(inner) => *inner,
387            Self::USIZE(inner) => *inner as i128,
388            Self::ISIZE(inner) => *inner as i128,
389        }
390    }
391
392    fn as_usize(&self) -> usize {
393        match self {
394            Self::U8(inner) => *inner as usize,
395            Self::I8(inner) => *inner as usize,
396            Self::U16(inner) => *inner as usize,
397            Self::I16(inner) => *inner as usize,
398            Self::U32(inner) => *inner as usize,
399            Self::I32(inner) => *inner as usize,
400            Self::U64(inner) => *inner as usize,
401            Self::I64(inner) => *inner as usize,
402            Self::U128(inner) => *inner as usize,
403            Self::I128(inner) => *inner as usize,
404            Self::USIZE(inner) => *inner,
405            Self::ISIZE(inner) => *inner as usize,
406        }
407    }
408
409    fn as_isize(&self) -> isize {
410        match self {
411            Self::U8(inner) => *inner as isize,
412            Self::I8(inner) => *inner as isize,
413            Self::U16(inner) => *inner as isize,
414            Self::I16(inner) => *inner as isize,
415            Self::U32(inner) => *inner as isize,
416            Self::I32(inner) => *inner as isize,
417            Self::U64(inner) => *inner as isize,
418            Self::I64(inner) => *inner as isize,
419            Self::U128(inner) => *inner as isize,
420            Self::I128(inner) => *inner as isize,
421            Self::USIZE(inner) => *inner as isize,
422            Self::ISIZE(inner) => *inner,
423        }
424    }
425}