1use serde::{Deserialize, Serialize};
2
3use super::*;
4
5#[derive(Clone, Debug, Serialize, Deserialize)]
6#[allow(clippy::large_enum_variant)]
7pub enum TypeSpec {
8 IntegerType(IntegerType),
9 FloatingPtType,
10 CharType,
11 WideCharType,
12 Boolean,
13 AnyType,
14 ObjectType,
15 ValueBaseType,
16 ScopedName(ScopedName),
17 SequenceType(SequenceType),
18 StringType(StringType),
19 WideStringType(WideStringType),
20 FixedPtType(FixedPtType),
21 MapType(MapType),
22 TemplateType(TemplateType),
23}
24
25#[derive(Clone, Debug, Serialize, Deserialize)]
26pub struct SequenceType {
27 pub ty: Box<TypeSpec>,
28 pub len: Option<PositiveIntConst>,
29}
30
31#[derive(Clone, Debug, Serialize, Deserialize)]
32pub struct MapType {
33 pub key: Box<TypeSpec>,
34 pub value: Box<TypeSpec>,
35 pub len: Option<PositiveIntConst>,
36}
37
38#[derive(Clone, Debug, Serialize, Deserialize)]
39pub struct TemplateType {
40 pub ident: String,
41 pub args: Vec<TypeSpec>,
42}
43
44#[derive(Clone, Debug, Serialize, Deserialize)]
45pub struct StringType {
46 pub bound: Option<PositiveIntConst>,
47}
48
49#[derive(Clone, Debug, Serialize, Deserialize)]
50pub struct WideStringType {
51 pub bound: Option<PositiveIntConst>,
52}
53
54#[derive(Clone, Debug, Serialize, Deserialize)]
55pub struct FixedPtType {
56 pub integer: PositiveIntConst,
57 pub fraction: PositiveIntConst,
58}
59
60#[derive(Clone, Debug, Serialize, Deserialize)]
61pub enum IntegerType {
62 Char,
63 UChar,
64 Octet,
65 U8,
66 U16,
67 U32,
68 U64,
69 I8,
70 I16,
71 I32,
72 I64,
73}
74
75impl From<crate::typed_ast::TypeSpec> for TypeSpec {
76 fn from(value: crate::typed_ast::TypeSpec) -> Self {
77 match value {
78 crate::typed_ast::TypeSpec::SimpleTypeSpec(simple_type_spec) => simple_type_spec.into(),
79 crate::typed_ast::TypeSpec::TemplateTypeSpec(template_type_spec) => {
80 template_type_spec.into()
81 }
82 }
83 }
84}
85
86impl From<crate::typed_ast::SimpleTypeSpec> for TypeSpec {
87 fn from(ty: crate::typed_ast::SimpleTypeSpec) -> Self {
88 match ty {
89 crate::typed_ast::SimpleTypeSpec::BaseTypeSpec(base_type_spec) => {
90 match base_type_spec {
91 crate::typed_ast::BaseTypeSpec::IntegerType(integer_type) => {
92 TypeSpec::IntegerType(integer_type.into())
93 }
94 crate::typed_ast::BaseTypeSpec::FloatingPtType(_) => TypeSpec::FloatingPtType,
95 crate::typed_ast::BaseTypeSpec::CharType(_) => TypeSpec::CharType,
96 crate::typed_ast::BaseTypeSpec::WideCharType(_) => TypeSpec::WideCharType,
97 crate::typed_ast::BaseTypeSpec::BooleanType(_) => TypeSpec::Boolean,
98 crate::typed_ast::BaseTypeSpec::OctetType(_) => {
99 TypeSpec::IntegerType(IntegerType::Octet)
100 }
101 crate::typed_ast::BaseTypeSpec::AnyType(_) => TypeSpec::AnyType,
102 crate::typed_ast::BaseTypeSpec::ObjectType(_) => TypeSpec::ObjectType,
103 crate::typed_ast::BaseTypeSpec::ValueBaseType(_) => TypeSpec::ValueBaseType,
104 }
105 }
106 crate::typed_ast::SimpleTypeSpec::ScopedName(scoped_name) => {
107 TypeSpec::ScopedName(scoped_name.into())
108 }
109 }
110 }
111}
112
113impl From<crate::typed_ast::IntegerType> for IntegerType {
114 fn from(value: crate::typed_ast::IntegerType) -> Self {
115 match value {
116 crate::typed_ast::IntegerType::SignedInt(signed_int) => match signed_int {
117 crate::typed_ast::SignedInt::SignedShortInt(_) => Self::I16,
118 crate::typed_ast::SignedInt::SignedLongInt(_) => Self::I32,
119 crate::typed_ast::SignedInt::SignedLongLongInt(_) => Self::I64,
120 crate::typed_ast::SignedInt::SignedTinyInt(_) => Self::I8,
121 },
122 crate::typed_ast::IntegerType::UnsignedInt(unsigned_int) => match unsigned_int {
123 crate::typed_ast::UnsignedInt::UnsignedShortInt(_) => Self::U16,
124 crate::typed_ast::UnsignedInt::UnsignedLongInt(_) => Self::U32,
125 crate::typed_ast::UnsignedInt::UnsignedLongLongInt(_) => Self::U64,
126 crate::typed_ast::UnsignedInt::UnsignedTinyInt(_) => Self::U8,
127 },
128 }
129 }
130}
131
132impl From<crate::typed_ast::TemplateTypeSpec> for TypeSpec {
133 fn from(value: crate::typed_ast::TemplateTypeSpec) -> Self {
134 match value {
135 crate::typed_ast::TemplateTypeSpec::SequenceType(sequence_type) => {
136 TypeSpec::SequenceType(sequence_type.into())
137 }
138 crate::typed_ast::TemplateTypeSpec::StringType(string_type) => {
139 TypeSpec::StringType(string_type.into())
140 }
141 crate::typed_ast::TemplateTypeSpec::WideStringType(wide_string_type) => {
142 TypeSpec::WideStringType(wide_string_type.into())
143 }
144 crate::typed_ast::TemplateTypeSpec::FixedPtType(fixed_pt_type) => {
145 TypeSpec::FixedPtType(fixed_pt_type.into())
146 }
147 crate::typed_ast::TemplateTypeSpec::MapType(map_type) => {
148 TypeSpec::MapType(map_type.into())
149 }
150 crate::typed_ast::TemplateTypeSpec::TemplateType(template_type) => {
151 TypeSpec::TemplateType(template_type.into())
152 }
153 }
154 }
155}
156
157impl From<crate::typed_ast::SequenceType> for SequenceType {
158 fn from(value: crate::typed_ast::SequenceType) -> Self {
159 Self {
160 ty: Box::new((*value.ty).into()),
161 len: value.len.map(Into::into),
162 }
163 }
164}
165
166impl From<crate::typed_ast::MapType> for MapType {
167 fn from(value: crate::typed_ast::MapType) -> Self {
168 Self {
169 key: Box::new((*value.key).into()),
170 value: Box::new((*value.value).into()),
171 len: value.len.map(Into::into),
172 }
173 }
174}
175
176impl From<crate::typed_ast::TemplateType> for TemplateType {
177 fn from(value: crate::typed_ast::TemplateType) -> Self {
178 Self {
179 ident: value.ident.0,
180 args: value.args.into_iter().map(Into::into).collect(),
181 }
182 }
183}
184
185impl From<crate::typed_ast::StringType> for StringType {
186 fn from(value: crate::typed_ast::StringType) -> Self {
187 Self {
188 bound: value.bound.map(Into::into),
189 }
190 }
191}
192
193impl From<crate::typed_ast::WideStringType> for WideStringType {
194 fn from(value: crate::typed_ast::WideStringType) -> Self {
195 Self {
196 bound: value.bound.map(Into::into),
197 }
198 }
199}
200
201impl From<crate::typed_ast::FixedPtType> for FixedPtType {
202 fn from(value: crate::typed_ast::FixedPtType) -> Self {
203 Self {
204 integer: value.integer.into(),
205 fraction: value.fraction.into(),
206 }
207 }
208}