Skip to main content

mago_type_syntax/cst/
array.rs

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