melodium_common/executive/value/
mod.rs1mod 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}