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 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}