1#[derive(Clone)]
3pub enum Value {
4 Enum(u8),
5 String(String),
6 U8(u8),
7 U16(u16),
8 U32(u32),
9 U64(u64),
10 I8(i8),
11 I16(i16),
12 I32(i32),
13 I64(i64),
14 F32(f32),
15 F64(f64),
16 Time(u32),
17 Array(Vec<Value>),
18}
19
20impl Value {
21 pub fn scale(self, s: Option<f64>) -> Self {
22 match s {
23 None => self,
24 Some(rhs) => match self {
25 Value::U8(v) => Value::F64(f64::from(v) / rhs),
26 Value::U16(v) => Value::F64(f64::from(v) / rhs),
27 Value::U32(v) => Value::F64(f64::from(v) / rhs),
28 Value::U64(v) => Value::F64(v as f64 / rhs),
29 Value::I8(v) => Value::F64(f64::from(v) / rhs),
30 Value::I16(v) => Value::F64(f64::from(v) / rhs),
31 Value::I32(v) => Value::F64(f64::from(v) / rhs),
32 Value::I64(v) => Value::F64(v as f64 / rhs),
33 Value::F32(v) => Value::F64(f64::from(v) / rhs),
34 Value::F64(v) => Value::F64(v / rhs),
35 _ => self,
36 },
37 }
38 }
39 pub fn offset(self, o: Option<f64>) -> Self {
40 match o {
41 None => self,
42 Some(rhs) => match self {
43 Value::U8(v) => Value::F64(f64::from(v) - rhs),
44 Value::U16(v) => Value::F64(f64::from(v) - rhs),
45 Value::U32(v) => Value::F64(f64::from(v) - rhs),
46 Value::U64(v) => Value::F64(v as f64 - rhs),
47 Value::I8(v) => Value::F64(f64::from(v) - rhs),
48 Value::I16(v) => Value::F64(f64::from(v) - rhs),
49 Value::I32(v) => Value::F64(f64::from(v) - rhs),
50 Value::I64(v) => Value::F64(v as f64 - rhs),
51 Value::F32(v) => Value::F64(f64::from(v) - rhs),
52 Value::F64(v) => Value::F64(v - rhs),
53 _ => self,
54 },
55 }
56 }
57
58 pub fn u8(&self) -> u8 {
59 if let Value::U8(i) = self {
60 *i
61 } else {
62 panic!("not a u8")
63 }
64 }
65}
66
67impl PartialEq for Value {
68 fn eq(&self, other: &Value) -> bool {
69 match self {
70 Value::U8(v) => {
71 if let Value::U8(ov) = other {
72 v == ov
73 } else {
74 panic!("failed comparing U8 {:?} with {:?}", self, other)
75 }
76 }
77 Value::U16(v) => {
78 if let Value::U16(ov) = other {
79 v == ov
80 } else {
81 panic!("failed comparing U16 {:?} with {:?}", self, other)
82 }
83 }
84 Value::U32(v) => {
85 if let Value::U32(ov) = other {
86 v == ov
87 } else {
88 panic!("failed comparing U32 {:?} with {:?}", self, other)
89 }
90 }
91 Value::U64(v) => {
92 if let Value::U64(ov) = other {
93 v == ov
94 } else {
95 panic!("failed comparing U64 {:?} with {:?}", self, other)
96 }
97 }
98 Value::I8(v) => {
99 if let Value::I8(ov) = other {
100 v == ov
101 } else {
102 panic!("failed comparing I8 {:?} with {:?}", self, other)
103 }
104 }
105 Value::I16(v) => {
106 if let Value::I16(ov) = other {
107 v == ov
108 } else {
109 panic!("failed comparing I16 {:?} with {:?}", self, other)
110 }
111 }
112 Value::I32(v) => {
113 if let Value::I32(ov) = other {
114 v == ov
115 } else {
116 panic!("failed comparing I32 {:?} with {:?}", self, other)
117 }
118 }
119 Value::I64(v) => {
120 if let Value::I64(ov) = other {
121 v == ov
122 } else {
123 panic!("failed comparing I64 {:?} with {:?}", self, other)
124 }
125 }
126 Value::F32(v) => match other {
127 Value::U32(ov) => {
128 let f = *ov as f32;
129 *v == f
130 }
131 Value::F32(f) => v == f,
132 _ => panic!("failed comparing F32 {:?} with {:?}", self, other),
133 },
134 Value::F64(v) => match other {
135 Value::U64(ov) => {
136 let f = *ov as f64;
137 *v == f
138 }
139 Value::F64(f) => v == f,
140 _ => panic!("failed comparing F64 {:?} with {:?}", self, other),
141 },
142 Value::Time(v) => {
143 if let Value::Time(ov) = other {
144 v == ov
145 } else {
146 panic!("failed comparing Time {:?} with {:?}", self, other)
147 }
148 }
149 Value::String(v) => {
150 if let Value::String(ov) = other {
151 v == ov
152 } else {
153 panic!("failed comparing Str {:?} with {:?}", self, other)
154 }
155 }
156 Value::Enum(v) => {
157 if let Value::Enum(ov) = other {
158 v == ov
159 } else {
160 panic!("failed comparing Enum {:?} with {:?}", self, other)
161 }
162 }
163 Value::Array(_v) => true,
164 }
165 }
166}
167
168impl std::fmt::Display for Value {
169 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
170 match self {
171 Value::U8(v) => write!(f, "{}", v),
172 Value::U16(v) => write!(f, "{}", v),
173 Value::U32(v) => write!(f, "{}", v),
174 Value::U64(v) => write!(f, "{}", v),
175 Value::I8(v) => write!(f, "{}", v),
176 Value::I16(v) => write!(f, "{}", v),
177 Value::I32(v) => write!(f, "{}", v),
178 Value::I64(v) => write!(f, "{}", v),
179 Value::F32(v) => write!(f, "{}", v),
180 Value::F64(v) => write!(f, "{}", v),
181 Value::Time(v) => write!(f, "{}", v),
182 Value::String(v) => write!(f, "\"{}\"", v),
183 Value::Enum(v) => write!(f, "\"{}\"", v),
184 Value::Array(v) => write!(f, "\"{:?}\"", v),
185 }
186 }
187}
188impl std::fmt::Debug for Value {
189 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
190 match self {
191 Value::U8(v) => write!(f, "{} /u8", v),
192 Value::U16(v) => write!(f, "{} /u16", v),
193 Value::U32(v) => write!(f, "{} /u32", v),
194 Value::U64(v) => write!(f, "{} /u64", v),
195 Value::I8(v) => write!(f, "{} /i8", v),
196 Value::I16(v) => write!(f, "{} /i16", v),
197 Value::I32(v) => write!(f, "{} /i32", v),
198 Value::I64(v) => write!(f, "{} /i64", v),
199 Value::F32(v) => write!(f, "{} /f32", v),
200 Value::F64(v) => write!(f, "{} /f64", v),
201 Value::Time(v) => write!(f, "{} /time", v),
202 Value::String(v) => write!(f, "\"{}\" /str", v),
203 Value::Enum(v) => write!(f, "\"{}\" /enum", v),
204 Value::Array(v) => write!(f, "\"{:?}\" /arr", v),
205 }
206 }
207}
208
209impl From<u8> for Value {
210 fn from(f: u8) -> Self {
211 Value::U8(f)
212 }
213}
214impl From<u16> for Value {
215 fn from(f: u16) -> Self {
216 Value::U16(f)
217 }
218}
219impl From<u32> for Value {
220 fn from(f: u32) -> Self {
221 Value::U32(f)
222 }
223}
224impl From<u64> for Value {
225 fn from(f: u64) -> Self {
226 Value::U64(f)
227 }
228}
229impl From<i8> for Value {
230 fn from(f: i8) -> Self {
231 Value::I8(f)
232 }
233}
234impl From<i16> for Value {
235 fn from(f: i16) -> Self {
236 Value::I16(f)
237 }
238}
239impl From<i32> for Value {
240 fn from(f: i32) -> Self {
241 Value::I32(f)
242 }
243}
244impl From<i64> for Value {
245 fn from(f: i64) -> Self {
246 Value::I64(f)
247 }
248}
249impl From<f32> for Value {
250 fn from(f: f32) -> Self {
251 Value::F32(f)
252 }
253}
254impl From<f64> for Value {
255 fn from(f: f64) -> Self {
256 Value::F64(f)
257 }
258}
259impl From<&str> for Value {
260 fn from(f: &str) -> Self {
261 Value::String(f.to_owned())
262 }
263}
264impl From<String> for Value {
265 fn from(f: String) -> Self {
266 Value::String(f)
267 }
268}
269impl From<&[Value]> for Value {
270 fn from(v: &[Value]) -> Self {
271 Value::Array(v.to_vec())
272 }
273}
274impl From<Vec<Value>> for Value {
275 fn from(v: Vec<Value>) -> Self {
276 Value::Array(v)
277 }
278}