Skip to main content

melodium_share/
described_type.rs

1use super::{Data, DataType, Generic, SharingError, SharingResult};
2use core::fmt::Display;
3use melodium_common::descriptor::{
4    Collection, DescribedType as CommonDescribedType, Entry as CommonEntry,
5    Identifier as CommonIdentifier,
6};
7use melodium_engine::LogicError;
8use serde::{Deserialize, Serialize};
9use std::sync::Arc;
10
11#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
12#[serde(rename_all = "snake_case")]
13#[cfg_attr(feature = "webassembly", derive(tsify::Tsify))]
14#[cfg_attr(feature = "webassembly", tsify(into_wasm_abi, from_wasm_abi))]
15pub enum DescribedType {
16    Void,
17
18    I8,
19    I16,
20    I32,
21    I64,
22    I128,
23
24    U8,
25    U16,
26    U32,
27    U64,
28    U128,
29
30    F32,
31    F64,
32
33    Bool,
34    Byte,
35
36    Char,
37    String,
38
39    Vec(Box<DescribedType>),
40    Option(Box<DescribedType>),
41
42    Data(Data),
43
44    Generic(Generic),
45}
46
47impl DescribedType {
48    pub fn to_described_type(
49        &self,
50        collection: &Collection,
51        scope: &CommonIdentifier,
52    ) -> SharingResult<CommonDescribedType> {
53        match self {
54            DescribedType::Void => SharingResult::new_success(CommonDescribedType::Void),
55
56            DescribedType::I8 => SharingResult::new_success(CommonDescribedType::I8),
57            DescribedType::I16 => SharingResult::new_success(CommonDescribedType::I16),
58            DescribedType::I32 => SharingResult::new_success(CommonDescribedType::I32),
59            DescribedType::I64 => SharingResult::new_success(CommonDescribedType::I64),
60            DescribedType::I128 => SharingResult::new_success(CommonDescribedType::I128),
61
62            DescribedType::U8 => SharingResult::new_success(CommonDescribedType::U8),
63            DescribedType::U16 => SharingResult::new_success(CommonDescribedType::U16),
64            DescribedType::U32 => SharingResult::new_success(CommonDescribedType::U32),
65            DescribedType::U64 => SharingResult::new_success(CommonDescribedType::U64),
66            DescribedType::U128 => SharingResult::new_success(CommonDescribedType::U128),
67
68            DescribedType::F32 => SharingResult::new_success(CommonDescribedType::F32),
69            DescribedType::F64 => SharingResult::new_success(CommonDescribedType::F64),
70
71            DescribedType::Bool => SharingResult::new_success(CommonDescribedType::Bool),
72            DescribedType::Byte => SharingResult::new_success(CommonDescribedType::Byte),
73
74            DescribedType::Char => SharingResult::new_success(CommonDescribedType::Char),
75            DescribedType::String => SharingResult::new_success(CommonDescribedType::String),
76
77            DescribedType::Vec(dt) => {
78                SharingResult::new_success(CommonDescribedType::Vec(Box::new({
79                    let result = dt.as_ref().to_described_type(collection, scope);
80                    if let Some(subtype) = result.success() {
81                        subtype.clone()
82                    } else {
83                        return result;
84                    }
85                })))
86            }
87            DescribedType::Option(dt) => {
88                SharingResult::new_success(CommonDescribedType::Option(Box::new({
89                    let result = dt.as_ref().to_described_type(collection, scope);
90                    if let Some(subtype) = result.success() {
91                        subtype.clone()
92                    } else {
93                        return result;
94                    }
95                })))
96            }
97            DescribedType::Data(data) => {
98                let identifier: CommonIdentifier =
99                    if let Ok(identifier) = (&data.identifier).try_into() {
100                        identifier
101                    } else {
102                        return SharingResult::new_failure(SharingError::invalid_identifier(
103                            5,
104                            data.identifier.clone(),
105                        ));
106                    };
107                if let Some(CommonEntry::Data(data)) = collection.get(&(&identifier).into()) {
108                    SharingResult::new_success(CommonDescribedType::Data(Box::new(Arc::clone(
109                        data,
110                    ))))
111                } else {
112                    return SharingResult::new_failure(
113                        LogicError::unexisting_data(231, scope.clone(), identifier.into(), None)
114                            .into(),
115                    );
116                }
117            }
118
119            DescribedType::Generic(generic) => {
120                SharingResult::new_success(CommonDescribedType::Generic(Box::new(generic.into())))
121            }
122        }
123    }
124}
125
126impl From<CommonDescribedType> for DescribedType {
127    fn from(value: CommonDescribedType) -> Self {
128        (&value).into()
129    }
130}
131
132impl From<&CommonDescribedType> for DescribedType {
133    fn from(value: &CommonDescribedType) -> Self {
134        match value {
135            CommonDescribedType::Void => DescribedType::Void,
136
137            CommonDescribedType::I8 => DescribedType::I8,
138            CommonDescribedType::I16 => DescribedType::I16,
139            CommonDescribedType::I32 => DescribedType::I32,
140            CommonDescribedType::I64 => DescribedType::I64,
141            CommonDescribedType::I128 => DescribedType::I128,
142
143            CommonDescribedType::U8 => DescribedType::U8,
144            CommonDescribedType::U16 => DescribedType::U16,
145            CommonDescribedType::U32 => DescribedType::U32,
146            CommonDescribedType::U64 => DescribedType::U64,
147            CommonDescribedType::U128 => DescribedType::U128,
148
149            CommonDescribedType::F32 => DescribedType::F32,
150            CommonDescribedType::F64 => DescribedType::F64,
151
152            CommonDescribedType::Bool => DescribedType::Bool,
153            CommonDescribedType::Byte => DescribedType::Byte,
154
155            CommonDescribedType::Char => DescribedType::Char,
156            CommonDescribedType::String => DescribedType::String,
157            CommonDescribedType::Vec(dt) => DescribedType::Vec(Box::new(dt.as_ref().into())),
158            CommonDescribedType::Option(dt) => DescribedType::Option(Box::new(dt.as_ref().into())),
159
160            CommonDescribedType::Data(data) => DescribedType::Data(data.as_ref().as_ref().into()),
161            CommonDescribedType::Generic(generic) => {
162                DescribedType::Generic(generic.as_ref().into())
163            }
164        }
165    }
166}
167
168impl From<DataType> for DescribedType {
169    fn from(value: DataType) -> Self {
170        match value {
171            DataType::Undetermined => DescribedType::Generic(Generic {
172                name: "undetermined".to_string(),
173                traits: Vec::new(),
174            }),
175            DataType::Void => DescribedType::Void,
176            DataType::I8 => DescribedType::I8,
177            DataType::I16 => DescribedType::I16,
178            DataType::I32 => DescribedType::I32,
179            DataType::I64 => DescribedType::I64,
180            DataType::I128 => DescribedType::I128,
181            DataType::U8 => DescribedType::U8,
182            DataType::U16 => DescribedType::U16,
183            DataType::U32 => DescribedType::U32,
184            DataType::U64 => DescribedType::U64,
185            DataType::U128 => DescribedType::U128,
186            DataType::F32 => DescribedType::F32,
187            DataType::F64 => DescribedType::F64,
188            DataType::Bool => DescribedType::Bool,
189            DataType::Byte => DescribedType::Byte,
190            DataType::Char => DescribedType::Char,
191            DataType::String => DescribedType::String,
192            DataType::Vec(inner) => DescribedType::Vec(Box::new(DescribedType::from(*inner))),
193            DataType::Option(inner) => DescribedType::Option(Box::new(DescribedType::from(*inner))),
194            DataType::Data(obj) => DescribedType::Data(obj),
195        }
196    }
197}
198
199impl From<&DataType> for DescribedType {
200    fn from(value: &DataType) -> Self {
201        match value {
202            DataType::Undetermined => DescribedType::Generic(Generic {
203                name: "undetermined".to_string(),
204                traits: Vec::new(),
205            }),
206            DataType::Void => DescribedType::Void,
207            DataType::I8 => DescribedType::I8,
208            DataType::I16 => DescribedType::I16,
209            DataType::I32 => DescribedType::I32,
210            DataType::I64 => DescribedType::I64,
211            DataType::I128 => DescribedType::I128,
212            DataType::U8 => DescribedType::U8,
213            DataType::U16 => DescribedType::U16,
214            DataType::U32 => DescribedType::U32,
215            DataType::U64 => DescribedType::U64,
216            DataType::U128 => DescribedType::U128,
217            DataType::F32 => DescribedType::F32,
218            DataType::F64 => DescribedType::F64,
219            DataType::Bool => DescribedType::Bool,
220            DataType::Byte => DescribedType::Byte,
221            DataType::Char => DescribedType::Char,
222            DataType::String => DescribedType::String,
223            DataType::Vec(inner) => {
224                DescribedType::Vec(Box::new(DescribedType::from(inner.as_ref())))
225            }
226            DataType::Option(inner) => {
227                DescribedType::Option(Box::new(DescribedType::from(inner.as_ref())))
228            }
229            DataType::Data(obj) => DescribedType::Data(obj.clone()),
230        }
231    }
232}
233
234impl TryInto<CommonDescribedType> for DescribedType {
235    type Error = ();
236    fn try_into(self) -> Result<CommonDescribedType, ()> {
237        TryInto::try_into(&self)
238    }
239}
240
241impl TryInto<CommonDescribedType> for &DescribedType {
242    type Error = ();
243    fn try_into(self) -> Result<CommonDescribedType, ()> {
244        match self {
245            DescribedType::Void => Ok(CommonDescribedType::Void),
246
247            DescribedType::I8 => Ok(CommonDescribedType::I8),
248            DescribedType::I16 => Ok(CommonDescribedType::I16),
249            DescribedType::I32 => Ok(CommonDescribedType::I32),
250            DescribedType::I64 => Ok(CommonDescribedType::I64),
251            DescribedType::I128 => Ok(CommonDescribedType::I128),
252
253            DescribedType::U8 => Ok(CommonDescribedType::U8),
254            DescribedType::U16 => Ok(CommonDescribedType::U16),
255            DescribedType::U32 => Ok(CommonDescribedType::U32),
256            DescribedType::U64 => Ok(CommonDescribedType::U64),
257            DescribedType::U128 => Ok(CommonDescribedType::U128),
258
259            DescribedType::F32 => Ok(CommonDescribedType::F32),
260            DescribedType::F64 => Ok(CommonDescribedType::F64),
261
262            DescribedType::Bool => Ok(CommonDescribedType::Bool),
263            DescribedType::Byte => Ok(CommonDescribedType::Byte),
264
265            DescribedType::Char => Ok(CommonDescribedType::Char),
266            DescribedType::String => Ok(CommonDescribedType::String),
267
268            DescribedType::Vec(dt) => {
269                Ok(CommonDescribedType::Vec(Box::new(dt.as_ref().try_into()?)))
270            }
271            DescribedType::Option(dt) => Ok(CommonDescribedType::Option(Box::new(
272                dt.as_ref().try_into()?,
273            ))),
274            DescribedType::Data(_) => Err(()),
275
276            DescribedType::Generic(generic) => {
277                Ok(CommonDescribedType::Generic(Box::new(generic.into())))
278            }
279        }
280    }
281}
282
283impl Display for DescribedType {
284    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
285        match self {
286            DescribedType::Void => write!(f, "void"),
287            DescribedType::I8 => write!(f, "i8"),
288            DescribedType::I16 => write!(f, "i16"),
289            DescribedType::I32 => write!(f, "i32"),
290            DescribedType::I64 => write!(f, "i64"),
291            DescribedType::I128 => write!(f, "i128"),
292            DescribedType::U8 => write!(f, "u8"),
293            DescribedType::U16 => write!(f, "u16"),
294            DescribedType::U32 => write!(f, "u32"),
295            DescribedType::U64 => write!(f, "u64"),
296            DescribedType::U128 => write!(f, "u128"),
297            DescribedType::F32 => write!(f, "f32"),
298            DescribedType::F64 => write!(f, "f64"),
299            DescribedType::Bool => write!(f, "bool"),
300            DescribedType::Byte => write!(f, "byte"),
301            DescribedType::Char => write!(f, "char"),
302            DescribedType::String => write!(f, "string"),
303            DescribedType::Vec(inner) => write!(f, "Vec<{inner}>"),
304            DescribedType::Option(inner) => write!(f, "Option<{inner}>"),
305            DescribedType::Data(obj) => write!(f, "{}", obj.identifier.name),
306            DescribedType::Generic(gen) => write!(f, "{}", gen.name),
307        }
308    }
309}