Skip to main content

mago_type_syntax/ast/
array.rs

1use serde::Serialize;
2
3use mago_span::HasSpan;
4use mago_span::Span;
5
6use crate::ast::generics::GenericParameters;
7use crate::ast::keyword::Keyword;
8
9#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
10pub struct ArrayType<'input> {
11    pub keyword: Keyword<'input>,
12    pub parameters: Option<GenericParameters<'input>>,
13}
14
15#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
16pub struct NonEmptyArrayType<'input> {
17    pub keyword: Keyword<'input>,
18    pub parameters: Option<GenericParameters<'input>>,
19}
20
21#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
22pub struct AssociativeArrayType<'input> {
23    pub keyword: Keyword<'input>,
24    pub parameters: Option<GenericParameters<'input>>,
25}
26
27#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
28pub struct ListType<'input> {
29    pub keyword: Keyword<'input>,
30    pub parameters: Option<GenericParameters<'input>>,
31}
32
33#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, PartialOrd, Ord)]
34pub struct NonEmptyListType<'input> {
35    pub keyword: Keyword<'input>,
36    pub parameters: Option<GenericParameters<'input>>,
37}
38
39impl HasSpan for ArrayType<'_> {
40    fn span(&self) -> Span {
41        match &self.parameters {
42            Some(parameters) => self.keyword.span.join(parameters.span()),
43            None => self.keyword.span,
44        }
45    }
46}
47
48impl HasSpan for NonEmptyArrayType<'_> {
49    fn span(&self) -> Span {
50        match &self.parameters {
51            Some(parameters) => self.keyword.span.join(parameters.span()),
52            None => self.keyword.span,
53        }
54    }
55}
56
57impl HasSpan for AssociativeArrayType<'_> {
58    fn span(&self) -> Span {
59        match &self.parameters {
60            Some(parameters) => self.keyword.span.join(parameters.span()),
61            None => self.keyword.span,
62        }
63    }
64}
65
66impl HasSpan for ListType<'_> {
67    fn span(&self) -> Span {
68        match &self.parameters {
69            Some(parameters) => self.keyword.span.join(parameters.span()),
70            None => self.keyword.span,
71        }
72    }
73}
74
75impl HasSpan for NonEmptyListType<'_> {
76    fn span(&self) -> Span {
77        match &self.parameters {
78            Some(parameters) => self.keyword.span.join(parameters.span()),
79            None => self.keyword.span,
80        }
81    }
82}
83
84impl std::fmt::Display for ArrayType<'_> {
85    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
86        if let Some(parameters) = &self.parameters {
87            write!(f, "{}{}", self.keyword, parameters)
88        } else {
89            write!(f, "{}", self.keyword)
90        }
91    }
92}
93
94impl std::fmt::Display for NonEmptyArrayType<'_> {
95    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
96        if let Some(parameters) = &self.parameters {
97            write!(f, "{}{}", self.keyword, parameters)
98        } else {
99            write!(f, "{}", self.keyword)
100        }
101    }
102}
103
104impl std::fmt::Display for AssociativeArrayType<'_> {
105    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
106        if let Some(parameters) = &self.parameters {
107            write!(f, "{}{}", self.keyword, parameters)
108        } else {
109            write!(f, "{}", self.keyword)
110        }
111    }
112}
113
114impl std::fmt::Display for ListType<'_> {
115    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
116        if let Some(parameters) = &self.parameters {
117            write!(f, "{}{}", self.keyword, parameters)
118        } else {
119            write!(f, "{}", self.keyword)
120        }
121    }
122}
123
124impl std::fmt::Display for NonEmptyListType<'_> {
125    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
126        if let Some(parameters) = &self.parameters {
127            write!(f, "{}{}", self.keyword, parameters)
128        } else {
129            write!(f, "{}", self.keyword)
130        }
131    }
132}