melodium_common/executive/value/
mod.rs

1mod data;
2mod traits;
3
4use super::Data;
5use crate::descriptor::DataType;
6pub use data::GetData;
7use std::sync::Arc;
8
9#[derive(Clone, Debug)]
10pub enum Value {
11    Void(()),
12
13    I8(i8),
14    I16(i16),
15    I32(i32),
16    I64(i64),
17    I128(i128),
18
19    U8(u8),
20    U16(u16),
21    U32(u32),
22    U64(u64),
23    U128(u128),
24
25    F32(f32),
26    F64(f64),
27
28    Bool(bool),
29    Byte(u8),
30    Char(char),
31    String(String),
32
33    Vec(Vec<Value>),
34    Option(Option<Box<Value>>),
35
36    Data(Arc<dyn Data>),
37}
38
39impl Value {
40    pub fn datatype(&self) -> DataType {
41        match self {
42            Value::Void(_) => DataType::Void,
43
44            Value::I8(_) => DataType::I8,
45            Value::I16(_) => DataType::I16,
46            Value::I32(_) => DataType::I32,
47            Value::I64(_) => DataType::I64,
48            Value::I128(_) => DataType::I128,
49
50            Value::U8(_) => DataType::U8,
51            Value::U16(_) => DataType::U16,
52            Value::U32(_) => DataType::U32,
53            Value::U64(_) => DataType::U64,
54            Value::U128(_) => DataType::U128,
55
56            Value::F32(_) => DataType::F32,
57            Value::F64(_) => DataType::F64,
58
59            Value::Bool(_) => DataType::Bool,
60            Value::Byte(_) => DataType::Byte,
61            Value::Char(_) => DataType::Char,
62            Value::String(_) => DataType::String,
63
64            Value::Option(val) => val
65                .as_ref()
66                .map(|val| DataType::Option(Box::new(val.datatype())))
67                .unwrap_or(DataType::Undetermined),
68            Value::Vec(val) => val
69                .first()
70                .map(|val| DataType::Vec(Box::new(val.datatype())))
71                .unwrap_or(DataType::Undetermined),
72
73            Value::Data(obj) => DataType::Data(obj.descriptor()),
74        }
75    }
76}
77
78impl PartialEq for Value {
79    fn eq(&self, other: &Self) -> bool {
80        match (self, other) {
81            (Self::Void(l0), Self::Void(r0)) => l0 == r0,
82            (Self::I8(l0), Self::I8(r0)) => l0 == r0,
83            (Self::I16(l0), Self::I16(r0)) => l0 == r0,
84            (Self::I32(l0), Self::I32(r0)) => l0 == r0,
85            (Self::I64(l0), Self::I64(r0)) => l0 == r0,
86            (Self::I128(l0), Self::I128(r0)) => l0 == r0,
87            (Self::U8(l0), Self::U8(r0)) => l0 == r0,
88            (Self::U16(l0), Self::U16(r0)) => l0 == r0,
89            (Self::U32(l0), Self::U32(r0)) => l0 == r0,
90            (Self::U64(l0), Self::U64(r0)) => l0 == r0,
91            (Self::U128(l0), Self::U128(r0)) => l0 == r0,
92            (Self::F32(l0), Self::F32(r0)) => l0 == r0,
93            (Self::F64(l0), Self::F64(r0)) => l0 == r0,
94            (Self::Bool(l0), Self::Bool(r0)) => l0 == r0,
95            (Self::Byte(l0), Self::Byte(r0)) => l0 == r0,
96            (Self::Char(l0), Self::Char(r0)) => l0 == r0,
97            (Self::String(l0), Self::String(r0)) => l0 == r0,
98            (Self::Vec(l0), Self::Vec(r0)) => l0 == r0,
99            (Self::Option(l0), Self::Option(r0)) => l0 == r0,
100            (Self::Data(l0), Self::Data(r0)) => {
101                if l0.descriptor() == r0.descriptor() {
102                    if l0
103                        .descriptor()
104                        .implements()
105                        .contains(&crate::descriptor::DataTrait::PartialEquality)
106                    {
107                        l0.partial_equality_eq(other)
108                    } else {
109                        false
110                    }
111                } else {
112                    false
113                }
114            }
115            _ => false,
116        }
117    }
118}