melodium_common/executive/value/
data.rs1use super::super::Data;
2use super::Value;
3use std::sync::Arc;
4
5pub 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}