canadensis_dsdl_parser/ast/
types.rs1use num_rational::BigRational;
4use pest::Span;
5
6#[derive(Debug)]
8pub struct Expression<'i> {
9 pub expression: ExpressionType<'i>,
11 pub span: Span<'i>,
13}
14
15#[derive(Debug)]
17pub enum ExpressionType<'i> {
18 Atom(Box<ExpressionAtom<'i>>),
20 UnaryPlus(Box<Expression<'i>>),
22 UnaryMinus(Box<Expression<'i>>),
24 UnaryNot(Box<Expression<'i>>),
26 Attribute(Box<Expression<'i>>, &'i str),
28 Exponent(Box<Expression<'i>>, Box<Expression<'i>>),
30 Multiply(Box<Expression<'i>>, Box<Expression<'i>>),
32 Divide(Box<Expression<'i>>, Box<Expression<'i>>),
34 Modulo(Box<Expression<'i>>, Box<Expression<'i>>),
36 Add(Box<Expression<'i>>, Box<Expression<'i>>),
38 Subtract(Box<Expression<'i>>, Box<Expression<'i>>),
40 BitOr(Box<Expression<'i>>, Box<Expression<'i>>),
42 BitXor(Box<Expression<'i>>, Box<Expression<'i>>),
44 BitAnd(Box<Expression<'i>>, Box<Expression<'i>>),
46 Equal(Box<Expression<'i>>, Box<Expression<'i>>),
48 NotEqual(Box<Expression<'i>>, Box<Expression<'i>>),
50 LessOrEqual(Box<Expression<'i>>, Box<Expression<'i>>),
52 GreaterOrEqual(Box<Expression<'i>>, Box<Expression<'i>>),
54 Less(Box<Expression<'i>>, Box<Expression<'i>>),
56 Greater(Box<Expression<'i>>, Box<Expression<'i>>),
58 LogicalOr(Box<Expression<'i>>, Box<Expression<'i>>),
60 LogicalAnd(Box<Expression<'i>>, Box<Expression<'i>>),
62}
63
64#[derive(Debug)]
66pub enum ExpressionAtom<'i> {
67 Parenthesized(Expression<'i>),
69 Type(Type<'i>),
71 Literal(Literal<'i>),
73 Identifier(&'i str),
75}
76
77#[derive(Debug)]
79pub struct Literal<'i> {
80 pub literal: LiteralType<'i>,
82 pub span: Span<'i>,
84}
85
86#[derive(Debug)]
88pub struct Identifier<'i> {
89 pub name: &'i str,
91 pub span: Span<'i>,
93}
94
95#[derive(Debug)]
97pub enum LiteralType<'i> {
98 Set(Vec<Expression<'i>>),
100 Number(BigRational),
102 String(String),
104 Boolean(bool),
106}
107
108#[derive(Debug)]
110pub enum Type<'i> {
111 Scalar(ScalarType<'i>),
113 Array(ArrayType<'i>),
115}
116
117#[derive(Debug)]
119pub enum ScalarType<'i> {
120 Versioned(VersionedType<'i>),
122 Primitive(PrimitiveType),
124 Void { bits: u8 },
126}
127
128#[derive(Debug)]
130pub enum PrimitiveType {
131 Boolean,
133 Utf8,
135 Byte,
137 Int { bits: u8 },
139 UInt { bits: u8, mode: CastMode },
141 Float16 { mode: CastMode },
143 Float32 { mode: CastMode },
145 Float64 { mode: CastMode },
147}
148
149#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq)]
151pub enum CastMode {
152 Truncated,
153 Saturated,
154}
155
156#[derive(Debug)]
158pub struct VersionedType<'i> {
159 pub path: Vec<&'i str>,
161 pub name: &'i str,
163 pub version: TypeVersion,
165}
166
167#[derive(Debug, Clone, PartialOrd, PartialEq, Ord, Eq)]
169pub struct TypeVersion {
170 pub major: u8,
172 pub minor: u8,
173}
174
175mod fmt_impl {
176 use super::TypeVersion;
177 use std::fmt::{Display, Formatter, Result};
178
179 impl Display for TypeVersion {
180 fn fmt(&self, f: &mut Formatter<'_>) -> Result {
181 write!(f, "{}.{}", self.major, self.minor)
182 }
183 }
184}
185
186#[derive(Debug)]
188pub struct ArrayType<'i> {
189 pub element: ScalarType<'i>,
193 pub length: ArrayLength<'i>,
195}
196
197#[derive(Debug)]
199pub enum ArrayLength<'i> {
200 Fixed(Expression<'i>),
202 Inclusive(Expression<'i>),
204 Exclusive(Expression<'i>),
206}
207
208#[derive(Debug)]
210pub enum Statement<'i> {
211 Directive {
213 name: Identifier<'i>,
214 value: Option<Expression<'i>>,
215 },
216 Constant {
218 ty: PrimitiveType,
219 name: Identifier<'i>,
220 value: Expression<'i>,
221 },
222 Field {
224 ty: Type<'i>,
225 name: Identifier<'i>,
226 span: Span<'i>,
227 },
228 PaddingField { bits: u8, span: Span<'i> },
230 ServiceResponseMarker(Span<'i>),
232 Comment(Span<'i>),
234}
235
236#[derive(Debug)]
238pub struct Definition<'i> {
239 pub statements: Vec<Statement<'i>>,
241 pub eof_span: Span<'i>,
243}