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}