melodium_common/executive/value/
data.rs

1use super::super::Data;
2use super::Value;
3use std::sync::Arc;
4
5/// Trait allowing to get real data based on Rust type.
6///
7/// This trait exist to circumvent E0119 that is disabling us to use TryInto.
8/// See https://github.com/rust-lang/rust/issues/50133
9pub trait GetData<T>: Sized {
10    fn try_data(self) -> Result<T, ()>;
11}
12
13impl From<()> for Value {
14    fn from(value: ()) -> Self {
15        Value::Void(value)
16    }
17}
18
19impl GetData<()> for Value {
20    fn try_data(self) -> Result<(), ()> {
21        match self {
22            Value::Void(_) => Ok(()),
23            _ => Err(()),
24        }
25    }
26}
27
28impl From<i8> for Value {
29    fn from(value: i8) -> Self {
30        Value::I8(value)
31    }
32}
33
34impl GetData<i8> for Value {
35    fn try_data(self) -> Result<i8, ()> {
36        match self {
37            Value::I8(val) => Ok(val),
38            _ => Err(()),
39        }
40    }
41}
42impl From<i16> for Value {
43    fn from(value: i16) -> Self {
44        Value::I16(value)
45    }
46}
47
48impl GetData<i16> for Value {
49    fn try_data(self) -> Result<i16, ()> {
50        match self {
51            Value::I16(val) => Ok(val),
52            _ => Err(()),
53        }
54    }
55}
56impl From<i32> for Value {
57    fn from(value: i32) -> Self {
58        Value::I32(value)
59    }
60}
61
62impl GetData<i32> for Value {
63    fn try_data(self) -> Result<i32, ()> {
64        match self {
65            Value::I32(val) => Ok(val),
66            _ => Err(()),
67        }
68    }
69}
70impl From<i64> for Value {
71    fn from(value: i64) -> Self {
72        Value::I64(value)
73    }
74}
75
76impl GetData<i64> for Value {
77    fn try_data(self) -> Result<i64, ()> {
78        match self {
79            Value::I64(val) => Ok(val),
80            _ => Err(()),
81        }
82    }
83}
84impl From<i128> for Value {
85    fn from(value: i128) -> Self {
86        Value::I128(value)
87    }
88}
89
90impl GetData<i128> for Value {
91    fn try_data(self) -> Result<i128, ()> {
92        match self {
93            Value::I128(val) => Ok(val),
94            _ => Err(()),
95        }
96    }
97}
98
99impl From<u8> for Value {
100    fn from(value: u8) -> Self {
101        Value::U8(value)
102    }
103}
104
105impl GetData<u8> for Value {
106    fn try_data(self) -> Result<u8, ()> {
107        match self {
108            Value::U8(val) => Ok(val),
109            Value::Byte(val) => Ok(val),
110            _ => Err(()),
111        }
112    }
113}
114impl From<u16> for Value {
115    fn from(value: u16) -> Self {
116        Value::U16(value)
117    }
118}
119
120impl GetData<u16> for Value {
121    fn try_data(self) -> Result<u16, ()> {
122        match self {
123            Value::U16(val) => Ok(val),
124            _ => Err(()),
125        }
126    }
127}
128impl From<u32> for Value {
129    fn from(value: u32) -> Self {
130        Value::U32(value)
131    }
132}
133
134impl GetData<u32> for Value {
135    fn try_data(self) -> Result<u32, ()> {
136        match self {
137            Value::U32(val) => Ok(val),
138            _ => Err(()),
139        }
140    }
141}
142impl From<u64> for Value {
143    fn from(value: u64) -> Self {
144        Value::U64(value)
145    }
146}
147
148impl GetData<u64> for Value {
149    fn try_data(self) -> Result<u64, ()> {
150        match self {
151            Value::U64(val) => Ok(val),
152            _ => Err(()),
153        }
154    }
155}
156impl From<u128> for Value {
157    fn from(value: u128) -> Self {
158        Value::U128(value)
159    }
160}
161
162impl GetData<u128> for Value {
163    fn try_data(self) -> Result<u128, ()> {
164        match self {
165            Value::U128(val) => Ok(val),
166            _ => Err(()),
167        }
168    }
169}
170
171impl From<f32> for Value {
172    fn from(value: f32) -> Self {
173        Value::F32(value)
174    }
175}
176
177impl GetData<f32> for Value {
178    fn try_data(self) -> Result<f32, ()> {
179        match self {
180            Value::F32(val) => Ok(val),
181            _ => Err(()),
182        }
183    }
184}
185impl From<f64> for Value {
186    fn from(value: f64) -> Self {
187        Value::F64(value)
188    }
189}
190
191impl GetData<f64> for Value {
192    fn try_data(self) -> Result<f64, ()> {
193        match self {
194            Value::F64(val) => Ok(val),
195            _ => Err(()),
196        }
197    }
198}
199
200impl From<bool> for Value {
201    fn from(value: bool) -> Self {
202        Value::Bool(value)
203    }
204}
205
206impl GetData<bool> for Value {
207    fn try_data(self) -> Result<bool, ()> {
208        match self {
209            Value::Bool(val) => Ok(val),
210            _ => Err(()),
211        }
212    }
213}
214impl From<char> for Value {
215    fn from(value: char) -> Self {
216        Value::Char(value)
217    }
218}
219
220impl GetData<char> for Value {
221    fn try_data(self) -> Result<char, ()> {
222        match self {
223            Value::Char(val) => Ok(val),
224            _ => Err(()),
225        }
226    }
227}
228impl From<String> for Value {
229    fn from(value: String) -> Self {
230        Value::String(value)
231    }
232}
233
234impl GetData<String> for Value {
235    fn try_data(self) -> Result<String, ()> {
236        match self {
237            Value::String(val) => Ok(val),
238            _ => Err(()),
239        }
240    }
241}
242
243impl<T: Into<Value>> From<Option<T>> for Value {
244    fn from(value: Option<T>) -> Self {
245        Value::Option(value.map(|val| Box::new(val.into())))
246    }
247}
248
249impl<T> GetData<Option<T>> for Value
250where
251    Self: GetData<T>,
252{
253    fn try_data(self) -> Result<Option<T>, ()> {
254        match self {
255            Value::Option(val) => {
256                if let Some(val) = val {
257                    match val.try_data() {
258                        Ok(val) => Ok(Some(val)),
259                        Err(_) => Err(()),
260                    }
261                } else {
262                    Ok(None)
263                }
264            }
265            _ => Err(()),
266        }
267    }
268}
269
270impl<T: Into<Value>> From<Vec<T>> for Value {
271    fn from(value: Vec<T>) -> Self {
272        Value::Vec(value.into_iter().map(|val| val.into()).collect())
273    }
274}
275
276impl<T> GetData<Vec<T>> for Value
277where
278    Self: GetData<T>,
279{
280    fn try_data(self) -> Result<Vec<T>, ()> {
281        match self {
282            Value::Vec(val) => {
283                let mut result = Vec::with_capacity(val.len());
284                for val in val {
285                    match val.try_data() {
286                        Ok(val) => result.push(val),
287                        Err(_) => return Err(()),
288                    }
289                }
290                Ok(result)
291            }
292            _ => Err(()),
293        }
294    }
295}
296
297impl From<Arc<dyn Data>> for Value {
298    fn from(value: Arc<dyn Data>) -> Self {
299        Value::Data(value)
300    }
301}
302
303impl GetData<Arc<dyn Data>> for Value {
304    fn try_data(self) -> Result<Arc<dyn Data>, ()> {
305        match self {
306            Value::Data(val) => Ok(val),
307            _ => Err(()),
308        }
309    }
310}