xee_xpath_type/
ast.rs

1use xee_name::Name;
2use xee_schema_type::Xs;
3use xot::xmlname::NameStrInfo;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize))]
7pub enum SequenceType {
8    Empty,
9    Item(Item),
10}
11
12impl SequenceType {
13    pub fn display_representation(&self) -> String {
14        match self {
15            SequenceType::Empty => "empty-sequence()".to_string(),
16            SequenceType::Item(item) => item.display_representation(),
17        }
18    }
19}
20
21#[derive(Debug, Clone, PartialEq, Eq)]
22#[cfg_attr(feature = "serde", derive(serde::Serialize))]
23pub struct Item {
24    pub item_type: ItemType,
25    pub occurrence: Occurrence,
26}
27
28impl Item {
29    fn display_representation(&self) -> String {
30        let occurrence = match self.occurrence {
31            Occurrence::One => "".to_string(),
32            Occurrence::Option => "?".to_string(),
33            Occurrence::Many => "*".to_string(),
34            Occurrence::NonEmpty => "+".to_string(),
35        };
36
37        format!("{}{}", self.item_type.display_representation(), occurrence)
38    }
39}
40
41#[derive(Debug, Clone, PartialEq, Eq)]
42#[cfg_attr(feature = "serde", derive(serde::Serialize))]
43pub enum ItemType {
44    Item,
45    AtomicOrUnionType(Xs),
46    KindTest(KindTest),
47    FunctionTest(FunctionTest),
48    MapTest(MapTest),
49    ArrayTest(ArrayTest),
50}
51
52impl ItemType {
53    fn display_representation(&self) -> String {
54        match self {
55            ItemType::Item => "item()".to_string(),
56            ItemType::AtomicOrUnionType(xs) => format!("xs:{}", xs.local_name()),
57            ItemType::KindTest(kind_test) => kind_test.display_representation(),
58            ItemType::FunctionTest(function_test) => function_test.display_representation(),
59            ItemType::MapTest(map_test) => map_test.display_representation(),
60            ItemType::ArrayTest(array_test) => array_test.display_representation(),
61        }
62    }
63}
64
65#[derive(Debug, Clone, Copy, PartialEq, Eq)]
66#[cfg_attr(feature = "serde", derive(serde::Serialize))]
67pub enum Occurrence {
68    One,
69    Option,
70    Many,
71    NonEmpty,
72}
73
74#[derive(Debug, Clone, PartialEq, Eq)]
75#[cfg_attr(feature = "serde", derive(serde::Serialize))]
76pub enum KindTest {
77    Document(Option<DocumentTest>),
78    Element(Option<ElementOrAttributeTest>),
79    Attribute(Option<ElementOrAttributeTest>),
80    SchemaElement(SchemaElementTest),
81    SchemaAttribute(SchemaAttributeTest),
82    PI(Option<PITest>),
83    Comment,
84    Text,
85    NamespaceNode,
86    Any,
87}
88
89impl KindTest {
90    fn display_representation(&self) -> String {
91        match self {
92            KindTest::Document(document_test) => {
93                format!(
94                    "document-node({})",
95                    document_test
96                        .as_ref()
97                        .map_or("".to_string(), |dt| dt.display_representation())
98                )
99            }
100            KindTest::Element(element_test) => {
101                format!(
102                    "element({})",
103                    element_test
104                        .as_ref()
105                        .map_or("".to_string(), |et| et.display_representation())
106                )
107            }
108            KindTest::Attribute(attribute_test) => {
109                format!(
110                    "attribute({})",
111                    attribute_test
112                        .as_ref()
113                        .map_or("".to_string(), |at| at.display_representation())
114                )
115            }
116            KindTest::SchemaElement(schema_element_test) => {
117                format!(
118                    "schema-element({})",
119                    schema_element_test.display_representation()
120                )
121            }
122            KindTest::SchemaAttribute(schema_attribute_test) => {
123                format!(
124                    "schema-attribute({})",
125                    schema_attribute_test.display_representation()
126                )
127            }
128            KindTest::PI(pi_test) => {
129                format!(
130                    "processing-instruction({})",
131                    pi_test
132                        .as_ref()
133                        .map_or("".to_string(), |pt| pt.display_representation())
134                )
135            }
136            KindTest::Comment => "comment()".to_string(),
137            KindTest::Text => "text()".to_string(),
138            KindTest::NamespaceNode => "namespace-node()".to_string(),
139            KindTest::Any => "node()".to_string(),
140        }
141    }
142}
143
144#[derive(Debug, Clone, PartialEq, Eq)]
145#[cfg_attr(feature = "serde", derive(serde::Serialize))]
146pub enum DocumentTest {
147    Element(Option<ElementOrAttributeTest>),
148    SchemaElement(SchemaElementTest),
149}
150
151impl DocumentTest {
152    fn display_representation(&self) -> String {
153        match self {
154            DocumentTest::Element(element_test) => {
155                format!(
156                    "element({})",
157                    element_test
158                        .as_ref()
159                        .map_or("".to_string(), |et| et.display_representation())
160                )
161            }
162            DocumentTest::SchemaElement(schema_element_test) => {
163                format!(
164                    "schema-element({})",
165                    schema_element_test.display_representation()
166                )
167            }
168        }
169    }
170}
171
172#[derive(Debug, Clone, PartialEq, Eq)]
173#[cfg_attr(feature = "serde", derive(serde::Serialize))]
174pub struct ElementOrAttributeTest {
175    pub name_or_wildcard: NameOrWildcard,
176    pub type_name: Option<TypeName>,
177}
178
179impl ElementOrAttributeTest {
180    fn display_representation(&self) -> String {
181        let name_or_wildcard = match &self.name_or_wildcard {
182            NameOrWildcard::Name(name) => name.full_name().to_string(),
183            NameOrWildcard::Wildcard => "*".to_string(),
184        };
185
186        let type_name = self
187            .type_name
188            .as_ref()
189            .map_or("".to_string(), |tn| tn.display_representation());
190
191        format!("{}{}", name_or_wildcard, type_name)
192    }
193}
194
195#[derive(Debug, Clone, PartialEq, Eq)]
196#[cfg_attr(feature = "serde", derive(serde::Serialize))]
197pub struct TypeName {
198    pub name: Xs,
199    // only relevant for elements; for attributes it's always true
200    pub can_be_nilled: bool,
201}
202
203impl TypeName {
204    fn display_representation(&self) -> String {
205        let nilled = if self.can_be_nilled { "? " } else { "" };
206        format!(" as {}{}", self.name.local_name(), nilled)
207    }
208}
209
210#[derive(Debug, Clone, PartialEq, Eq)]
211#[cfg_attr(feature = "serde", derive(serde::Serialize))]
212pub enum NameOrWildcard {
213    Name(Name),
214    Wildcard,
215}
216
217#[derive(Debug, Clone, PartialEq, Eq)]
218#[cfg_attr(feature = "serde", derive(serde::Serialize))]
219pub struct SchemaElementTest {
220    pub name: Name,
221}
222
223impl SchemaElementTest {
224    fn display_representation(&self) -> String {
225        self.name.full_name().to_string()
226    }
227}
228
229#[derive(Debug, Clone, PartialEq, Eq)]
230#[cfg_attr(feature = "serde", derive(serde::Serialize))]
231pub struct SchemaAttributeTest {
232    pub name: Name,
233}
234
235impl SchemaAttributeTest {
236    fn display_representation(&self) -> String {
237        self.name.full_name().to_string()
238    }
239}
240
241#[derive(Debug, Clone, PartialEq, Eq)]
242#[cfg_attr(feature = "serde", derive(serde::Serialize))]
243pub enum FunctionTest {
244    AnyFunctionTest,
245    TypedFunctionTest(Box<TypedFunctionTest>),
246}
247
248impl FunctionTest {
249    fn display_representation(&self) -> String {
250        match self {
251            FunctionTest::AnyFunctionTest => "function(*)".to_string(),
252            FunctionTest::TypedFunctionTest(tft) => tft.display_representation(),
253        }
254    }
255}
256
257#[derive(Debug, Clone, PartialEq, Eq)]
258#[cfg_attr(feature = "serde", derive(serde::Serialize))]
259pub struct TypedFunctionTest {
260    pub parameter_types: Vec<SequenceType>,
261    pub return_type: SequenceType,
262}
263
264impl TypedFunctionTest {
265    fn display_representation(&self) -> String {
266        let parameter_types = self
267            .parameter_types
268            .iter()
269            .map(|pt| pt.display_representation())
270            .collect::<Vec<_>>()
271            .join(", ");
272        let return_type = self.return_type.display_representation();
273        format!("function({}) as {}", parameter_types, return_type)
274    }
275}
276
277#[derive(Debug, Clone, PartialEq, Eq)]
278#[cfg_attr(feature = "serde", derive(serde::Serialize))]
279pub enum MapTest {
280    AnyMapTest,
281    TypedMapTest(Box<TypedMapTest>),
282}
283
284impl MapTest {
285    fn display_representation(&self) -> String {
286        match self {
287            MapTest::AnyMapTest => "map(*)".to_string(),
288            MapTest::TypedMapTest(tmt) => tmt.display_representation(),
289        }
290    }
291}
292
293#[derive(Debug, Clone, PartialEq, Eq)]
294#[cfg_attr(feature = "serde", derive(serde::Serialize))]
295pub struct TypedMapTest {
296    pub key_type: Xs,
297    pub value_type: SequenceType,
298}
299
300impl TypedMapTest {
301    fn display_representation(&self) -> String {
302        format!(
303            "map(xs:{} as {})",
304            self.key_type.local_name(),
305            self.value_type.display_representation()
306        )
307    }
308}
309
310#[derive(Debug, Clone, PartialEq, Eq)]
311#[cfg_attr(feature = "serde", derive(serde::Serialize))]
312pub enum ArrayTest {
313    AnyArrayTest,
314    TypedArrayTest(Box<TypedArrayTest>),
315}
316
317impl ArrayTest {
318    fn display_representation(&self) -> String {
319        match self {
320            ArrayTest::AnyArrayTest => "array(*)".to_string(),
321            ArrayTest::TypedArrayTest(tat) => tat.display_representation(),
322        }
323    }
324}
325
326#[derive(Debug, Clone, PartialEq, Eq)]
327#[cfg_attr(feature = "serde", derive(serde::Serialize))]
328pub struct TypedArrayTest {
329    pub item_type: SequenceType,
330}
331
332impl TypedArrayTest {
333    fn display_representation(&self) -> String {
334        format!("array({})", self.item_type.display_representation())
335    }
336}
337
338#[derive(Debug, Clone, PartialEq, Eq)]
339#[cfg_attr(feature = "serde", derive(serde::Serialize))]
340pub enum PITest {
341    Name(String),
342    StringLiteral(String),
343}
344
345impl PITest {
346    fn display_representation(&self) -> String {
347        match self {
348            PITest::Name(name) => name.to_string(),
349            PITest::StringLiteral(string_literal) => {
350                format!(r#""{}""#, string_literal)
351            }
352        }
353    }
354}