Skip to main content

xidl_parser/hir/
types.rs

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}