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 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}