Skip to main content

melodium_share/
data_type.rs

1use super::Data;
2use melodium_common::descriptor::{
3    Collection, DataType as CommonDataType, Entry as CommonEntry, Identifier as CommonIdentifier,
4};
5use serde::{Deserialize, Serialize};
6use std::sync::Arc;
7
8#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
9#[serde(rename_all = "snake_case")]
10#[cfg_attr(feature = "webassembly", derive(tsify::Tsify))]
11#[cfg_attr(feature = "webassembly", tsify(into_wasm_abi, from_wasm_abi))]
12pub enum DataType {
13    /// Special variant not aimed to be explicitly used,
14    /// it corresponds to the case a value Vec or Option
15    /// didn't contain any data, so is not determinable.
16    /// It always matches other data type, including itself.
17    Undetermined,
18
19    Void,
20
21    I8,
22    I16,
23    I32,
24    I64,
25    I128,
26
27    U8,
28    U16,
29    U32,
30    U64,
31    U128,
32
33    F32,
34    F64,
35
36    Bool,
37    Byte,
38
39    Char,
40    String,
41
42    Vec(Box<DataType>),
43    Option(Box<DataType>),
44
45    Data(Data),
46}
47
48impl DataType {
49    pub fn to_datatype(&self, collection: &Collection) -> Option<CommonDataType> {
50        match self {
51            DataType::Undetermined => Some(CommonDataType::Undetermined),
52
53            DataType::Void => Some(CommonDataType::Void),
54
55            DataType::I8 => Some(CommonDataType::I8),
56            DataType::I16 => Some(CommonDataType::I16),
57            DataType::I32 => Some(CommonDataType::I32),
58            DataType::I64 => Some(CommonDataType::I64),
59            DataType::I128 => Some(CommonDataType::I128),
60
61            DataType::U8 => Some(CommonDataType::U8),
62            DataType::U16 => Some(CommonDataType::U16),
63            DataType::U32 => Some(CommonDataType::U32),
64            DataType::U64 => Some(CommonDataType::U64),
65            DataType::U128 => Some(CommonDataType::U128),
66
67            DataType::F32 => Some(CommonDataType::F32),
68            DataType::F64 => Some(CommonDataType::F64),
69
70            DataType::Bool => Some(CommonDataType::Bool),
71            DataType::Byte => Some(CommonDataType::Byte),
72
73            DataType::Char => Some(CommonDataType::Char),
74            DataType::String => Some(CommonDataType::String),
75
76            DataType::Vec(dt) => Some(CommonDataType::Vec(Box::new(
77                dt.as_ref().to_datatype(collection)?,
78            ))),
79            DataType::Option(dt) => Some(CommonDataType::Option(Box::new(
80                dt.as_ref().to_datatype(collection)?,
81            ))),
82            DataType::Data(data) => collection
83                .get(
84                    &TryInto::<CommonIdentifier>::try_into(&data.identifier)
85                        .ok()?
86                        .into(),
87                )
88                .map(|entry| {
89                    if let CommonEntry::Data(data) = entry {
90                        Some(CommonDataType::Data(Arc::clone(data)))
91                    } else {
92                        None
93                    }
94                })
95                .flatten(),
96        }
97    }
98}
99
100impl From<&CommonDataType> for DataType {
101    fn from(value: &CommonDataType) -> Self {
102        match value {
103            CommonDataType::Undetermined => DataType::Undetermined,
104
105            CommonDataType::Void => DataType::Void,
106
107            CommonDataType::I8 => DataType::I8,
108            CommonDataType::I16 => DataType::I16,
109            CommonDataType::I32 => DataType::I32,
110            CommonDataType::I64 => DataType::I64,
111            CommonDataType::I128 => DataType::I128,
112
113            CommonDataType::U8 => DataType::U8,
114            CommonDataType::U16 => DataType::U16,
115            CommonDataType::U32 => DataType::U32,
116            CommonDataType::U64 => DataType::U64,
117            CommonDataType::U128 => DataType::U128,
118
119            CommonDataType::F32 => DataType::F32,
120            CommonDataType::F64 => DataType::F64,
121
122            CommonDataType::Bool => DataType::Bool,
123            CommonDataType::Byte => DataType::Byte,
124
125            CommonDataType::Char => DataType::Char,
126            CommonDataType::String => DataType::String,
127
128            CommonDataType::Vec(dt) => DataType::Vec(Box::new(dt.as_ref().into())),
129            CommonDataType::Option(dt) => DataType::Option(Box::new(dt.as_ref().into())),
130            CommonDataType::Data(data) => DataType::Data(data.as_ref().into()),
131        }
132    }
133}
134
135impl TryInto<CommonDataType> for DataType {
136    type Error = ();
137    fn try_into(self) -> Result<CommonDataType, ()> {
138        TryInto::try_into(&self)
139    }
140}
141
142impl TryInto<CommonDataType> for &DataType {
143    type Error = ();
144    fn try_into(self) -> Result<CommonDataType, ()> {
145        match self {
146            DataType::Undetermined => Ok(CommonDataType::Undetermined),
147
148            DataType::Void => Ok(CommonDataType::Void),
149
150            DataType::I8 => Ok(CommonDataType::I8),
151            DataType::I16 => Ok(CommonDataType::I16),
152            DataType::I32 => Ok(CommonDataType::I32),
153            DataType::I64 => Ok(CommonDataType::I64),
154            DataType::I128 => Ok(CommonDataType::I128),
155
156            DataType::U8 => Ok(CommonDataType::U8),
157            DataType::U16 => Ok(CommonDataType::U16),
158            DataType::U32 => Ok(CommonDataType::U32),
159            DataType::U64 => Ok(CommonDataType::U64),
160            DataType::U128 => Ok(CommonDataType::U128),
161
162            DataType::F32 => Ok(CommonDataType::F32),
163            DataType::F64 => Ok(CommonDataType::F64),
164
165            DataType::Bool => Ok(CommonDataType::Bool),
166            DataType::Byte => Ok(CommonDataType::Byte),
167
168            DataType::Char => Ok(CommonDataType::Char),
169            DataType::String => Ok(CommonDataType::String),
170
171            DataType::Vec(dt) => Ok(CommonDataType::Vec(Box::new(dt.as_ref().try_into()?))),
172            DataType::Option(dt) => Ok(CommonDataType::Option(Box::new(dt.as_ref().try_into()?))),
173            DataType::Data(_) => Err(()),
174        }
175    }
176}