rof_rs/object_format/data_value/
float.rs

1use crate::object_format::property::property_type::PropertyType;
2
3use super::super::DataValue;
4
5// Float
6
7#[derive(Debug)]
8pub enum DataValueFloat {
9    F32(f32),
10    F64(f64),
11}
12
13impl DataValue for DataValueFloat {
14    fn serialize(
15        &self,
16        _: bool,
17        _: usize,
18    ) -> (
19        PropertyType, /* serialized type */
20        String,       /* serialized value */
21    ) {
22        match self {
23            Self::F32(inner) => (PropertyType::simple(String::from("f32")), inner.to_string()),
24            Self::F64(inner) => (PropertyType::simple(String::from("f64")), inner.to_string()),
25        }
26    }
27
28    fn deserialize(
29        serialized_type: &PropertyType,
30        serialized_value: &str,
31    ) -> Option<Box<dyn DataValue>>
32    where
33        Self: Sized,
34    {
35        if serialized_type.sub_types_included() {
36            return None;
37        }
38
39        match serialized_type.get_base_type() {
40            "f32" => {
41                if let Ok(parsed_float) = serialized_value.parse::<f32>() {
42                    return Some(Box::new(Self::F32(parsed_float)));
43                } else {
44                    return None;
45                }
46            }
47
48            "f64" => {
49                if let Ok(parsed_float) = serialized_value.parse::<f64>() {
50                    return Some(Box::new(Self::F64(parsed_float)));
51                } else {
52                    return None;
53                }
54            }
55
56            _ => None,
57        }
58    }
59
60    fn clone_data_value(&self) -> Box<dyn DataValue> {
61        Box::new(match self {
62            Self::F32(value) => Self::F32(value.clone()),
63            Self::F64(value) => Self::F64(value.clone()),
64        })
65    }
66
67    // Number conversions
68
69    fn as_f32(&self) -> f32 {
70        match self {
71            Self::F32(inner) => *inner,
72            Self::F64(inner) => *inner as f32,
73        }
74    }
75
76    fn as_f64(&self) -> f64 {
77        match self {
78            Self::F32(inner) => *inner as f64,
79            Self::F64(inner) => *inner,
80        }
81    }
82
83    fn as_u8(&self) -> u8 {
84        match self {
85            Self::F32(inner) => *inner as u8,
86            Self::F64(inner) => *inner as u8,
87        }
88    }
89
90    fn as_i8(&self) -> i8 {
91        match self {
92            Self::F32(inner) => *inner as i8,
93            Self::F64(inner) => *inner as i8,
94        }
95    }
96
97    fn as_u16(&self) -> u16 {
98        match self {
99            Self::F32(inner) => *inner as u16,
100            Self::F64(inner) => *inner as u16,
101        }
102    }
103
104    fn as_i16(&self) -> i16 {
105        match self {
106            Self::F32(inner) => *inner as i16,
107            Self::F64(inner) => *inner as i16,
108        }
109    }
110
111    fn as_u32(&self) -> u32 {
112        match self {
113            Self::F32(inner) => *inner as u32,
114            Self::F64(inner) => *inner as u32,
115        }
116    }
117
118    fn as_i32(&self) -> i32 {
119        match self {
120            Self::F32(inner) => *inner as i32,
121            Self::F64(inner) => *inner as i32,
122        }
123    }
124
125    fn as_u64(&self) -> u64 {
126        match self {
127            Self::F32(inner) => *inner as u64,
128            Self::F64(inner) => *inner as u64,
129        }
130    }
131
132    fn as_i64(&self) -> i64 {
133        match self {
134            Self::F32(inner) => *inner as i64,
135            Self::F64(inner) => *inner as i64,
136        }
137    }
138
139    fn as_u128(&self) -> u128 {
140        match self {
141            Self::F32(inner) => *inner as u128,
142            Self::F64(inner) => *inner as u128,
143        }
144    }
145
146    fn as_i128(&self) -> i128 {
147        match self {
148            Self::F32(inner) => *inner as i128,
149            Self::F64(inner) => *inner as i128,
150        }
151    }
152
153    fn as_usize(&self) -> usize {
154        match self {
155            Self::F32(inner) => *inner as usize,
156            Self::F64(inner) => *inner as usize,
157        }
158    }
159
160    fn as_isize(&self) -> isize {
161        match self {
162            Self::F32(inner) => *inner as isize,
163            Self::F64(inner) => *inner as isize,
164        }
165    }
166}