1use std::{
4 borrow::Cow,
5 error::Error as StdError,
6 fmt::{self, Debug, Display},
7};
8
9use crate::{ExpandedName, Prefix, XmlNamespace};
10
11pub trait Error: Sized + StdError {
13 fn custom<T>(msg: T) -> Self
15 where
16 T: Display;
17
18 fn wrong_name(name: &ExpandedName<'_>, expected: &ExpandedName<'_>) -> Self;
20
21 fn unexpected_visit<T>(unexpected: Unexpected, expected: &T) -> Self;
23
24 fn missing_field(field: &str) -> Self;
26
27 fn no_possible_variant(ident: &str) -> Self;
29
30 fn missing_data() -> Self;
32
33 fn unknown_child() -> Self;
35
36 fn invalid_string() -> Self;
38}
39
40#[derive(Debug, thiserror::Error)]
42#[non_exhaustive]
43pub enum Unexpected {
44 #[error("text")]
46 Text,
47 #[error("cdata")]
49 CData,
50 #[error("sequence")]
52 Seq,
53 #[error("element start")]
55 ElementStart,
56 #[error("element end")]
58 ElementEnd,
59 #[error("attribute")]
61 Attribute,
62 #[error("comment")]
64 Comment,
65 #[error("declaration")]
67 Decl,
68 #[error("processing instruction")]
70 PI,
71 #[error("doctype")]
73 DocType,
74 #[error("eof")]
76 Eof,
77 #[error("none")]
79 None,
80}
81
82pub trait NamespaceContext {
84 fn default_namespace(&self) -> Option<XmlNamespace<'_>>;
86
87 fn resolve_prefix(&self, prefix: Prefix<'_>) -> Option<XmlNamespace<'_>>;
89}
90
91pub trait AttributesAccess<'de> {
93 type Error: Error;
95 type SubAccess<'a>: AttributesAccess<'de, Error = Self::Error> + 'a
97 where
98 Self: 'a;
99
100 fn next_attribute<T>(&mut self) -> Result<Option<T>, Self::Error>
102 where
103 T: Deserialize<'de>;
104
105 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error>;
107}
108
109impl<'de, T: AttributesAccess<'de>> AttributesAccess<'de> for &mut T {
110 type Error = T::Error;
111 type SubAccess<'a>
112 = T::SubAccess<'a>
113 where
114 Self: 'a;
115
116 fn next_attribute<D>(&mut self) -> Result<Option<D>, Self::Error>
117 where
118 D: Deserialize<'de>,
119 {
120 (*self).next_attribute()
121 }
122
123 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
124 (*self).sub_access()
125 }
126}
127
128pub trait ElementAccess<'de>: AttributesAccess<'de> {
130 type ChildrenAccess: SeqAccess<'de, Error = Self::Error>;
132
133 type NamespaceContext<'a>: NamespaceContext + 'a
135 where
136 Self: 'a;
137
138 fn name(&self) -> ExpandedName<'_>;
140
141 fn children(self) -> Result<Self::ChildrenAccess, Self::Error>;
143
144 fn namespace_context(&self) -> Self::NamespaceContext<'_>;
146}
147
148pub trait ElementAccessExt<'de>: ElementAccess<'de> {
150 fn ensure_name<E: Error>(&self, name: &ExpandedName) -> Result<(), E>;
152}
153
154impl<'de, T: ElementAccess<'de>> ElementAccessExt<'de> for T {
155 fn ensure_name<E: Error>(&self, name: &ExpandedName) -> Result<(), E> {
156 if self.name() == *name {
157 Ok(())
158 } else {
159 Err(Error::wrong_name(&self.name(), name))
160 }
161 }
162}
163
164pub trait AttributeAccess<'de> {
166 type Error: Error;
168
169 fn name(&self) -> ExpandedName<'_>;
171
172 fn value<T>(self) -> Result<T, Self::Error>
174 where
175 T: Deserialize<'de>;
176}
177
178pub trait AttributeAccessExt<'de>: AttributeAccess<'de> {
180 fn ensure_name<E: Error>(&self, name: &ExpandedName) -> Result<(), E>;
182}
183
184impl<'de, T: AttributeAccess<'de>> AttributeAccessExt<'de> for T {
185 fn ensure_name<E: Error>(&self, name: &ExpandedName) -> Result<(), E> {
186 if self.name() == *name {
187 Ok(())
188 } else {
189 Err(Error::wrong_name(&self.name(), name))
190 }
191 }
192}
193
194pub trait SeqAccess<'de> {
196 type Error: Error;
198
199 type SubAccess<'g>: SeqAccess<'de, Error = Self::Error>
201 where
202 Self: 'g;
203
204 fn next_element<T>(&mut self) -> Result<Option<T>, Self::Error>
206 where
207 T: Deserialize<'de>;
208
209 fn next_element_seq<T>(&mut self) -> Result<Option<T>, Self::Error>
211 where
212 T: Deserialize<'de>;
213
214 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error>;
216}
217
218impl<'de, T: SeqAccess<'de>> SeqAccess<'de> for &mut T {
219 type Error = T::Error;
220 type SubAccess<'g>
221 = T::SubAccess<'g>
222 where
223 Self: 'g;
224
225 fn next_element<U>(&mut self) -> Result<Option<U>, Self::Error>
226 where
227 U: Deserialize<'de>,
228 {
229 (*self).next_element()
230 }
231
232 fn next_element_seq<U>(&mut self) -> Result<Option<U>, Self::Error>
233 where
234 U: Deserialize<'de>,
235 {
236 (*self).next_element_seq()
237 }
238
239 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
240 (*self).sub_access()
241 }
242}
243
244pub trait XmlText<'de> {
246 type NamespaceContext<'a>: NamespaceContext + 'a
248 where
249 Self: 'a;
250
251 fn into_bytes(self) -> Cow<'de, [u8]>;
253
254 fn as_bytes(&self) -> &[u8];
256
257 fn into_string(self) -> Cow<'de, str>;
259
260 fn as_str(&self) -> &str;
262
263 fn namespace_context(&self) -> Self::NamespaceContext<'_>;
265}
266
267pub trait XmlCData<'de> {
269 type NamespaceContext<'a>: NamespaceContext + 'a
271 where
272 Self: 'a;
273
274 fn into_bytes(self) -> Cow<'de, [u8]>;
276
277 fn as_bytes(&self) -> &[u8];
279
280 fn into_string(self) -> Cow<'de, str>;
282
283 fn as_str(&self) -> &str;
285
286 fn namespace_context(&self) -> Self::NamespaceContext<'_>;
288}
289
290pub trait XmlProcessingInstruction {
292 type NamespaceContext<'a>: NamespaceContext + 'a
294 where
295 Self: 'a;
296
297 fn target(&self) -> &[u8];
299
300 fn content(&self) -> &[u8];
302
303 fn namespace_context(&self) -> Self::NamespaceContext<'_>;
305}
306
307pub trait XmlDeclaration {
309 type NamespaceContext<'a>: NamespaceContext + 'a
311 where
312 Self: 'a;
313
314 fn version(&self) -> &[u8];
316
317 fn encoding(&self) -> Option<&[u8]>;
319
320 fn standalone(&self) -> Option<&[u8]>;
322
323 fn namespace_context(&self) -> Self::NamespaceContext<'_>;
325}
326
327pub trait XmlComment<'de> {
329 type NamespaceContext<'a>: NamespaceContext + 'a
331 where
332 Self: 'a;
333
334 fn into_bytes(self) -> Cow<'de, [u8]>;
336
337 fn as_bytes(&self) -> &[u8];
339
340 fn namespace_context(&self) -> Self::NamespaceContext<'_>;
342}
343
344pub trait XmlDoctype<'de> {
346 type NamespaceContext<'a>: NamespaceContext + 'a
348 where
349 Self: 'a;
350
351 fn into_bytes(self) -> Cow<'de, [u8]>;
353
354 fn as_bytes(&self) -> &[u8];
356
357 fn namespace_context(&self) -> Self::NamespaceContext<'_>;
359}
360
361pub trait Visitor<'de>: Sized {
363 type Value: Deserialize<'de>;
365
366 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result;
368
369 fn visit_text<E, V>(self, value: V) -> Result<Self::Value, E>
371 where
372 E: Error,
373 V: XmlText<'de>,
374 {
375 let _ = value;
376 Err(Error::unexpected_visit(Unexpected::Text, &self))
377 }
378
379 fn visit_cdata<E, V>(self, value: V) -> Result<Self::Value, E>
381 where
382 E: Error,
383 V: XmlCData<'de>,
384 {
385 let _ = value;
386 Err(Error::unexpected_visit(Unexpected::CData, &self))
387 }
388
389 fn visit_element<A>(self, element: A) -> Result<Self::Value, A::Error>
391 where
392 A: ElementAccess<'de>,
393 {
394 let _ = element;
395 Err(Error::unexpected_visit(Unexpected::ElementStart, &self))
396 }
397
398 fn visit_attribute<A>(self, attribute: A) -> Result<Self::Value, A::Error>
400 where
401 A: AttributeAccess<'de>,
402 {
403 let _ = attribute;
404 Err(Error::unexpected_visit(Unexpected::Attribute, &self))
405 }
406
407 fn visit_seq<S>(self, mut sequence: S) -> Result<Self::Value, S::Error>
409 where
410 S: SeqAccess<'de>,
411 {
412 sequence
413 .next_element::<Self::Value>()?
414 .ok_or_else(Error::missing_data)
415 }
416
417 fn visit_pi<E, V>(self, pi: V) -> Result<Self::Value, E>
419 where
420 E: Error,
421 V: XmlProcessingInstruction,
422 {
423 let _ = pi;
424 Err(Error::unexpected_visit(Unexpected::PI, &self))
425 }
426
427 fn visit_decl<E, V>(self, declaration: V) -> Result<Self::Value, E>
429 where
430 E: Error,
431 V: XmlDeclaration,
432 {
433 let _ = declaration;
434 Err(Error::unexpected_visit(Unexpected::Decl, &self))
435 }
436
437 fn visit_comment<E, V>(self, comment: V) -> Result<Self::Value, E>
439 where
440 E: Error,
441 V: XmlComment<'de>,
442 {
443 let _ = comment;
444 Err(Error::unexpected_visit(Unexpected::Comment, &self))
445 }
446
447 fn visit_doctype<E, V>(self, doctype: V) -> Result<Self::Value, E>
449 where
450 E: Error,
451 V: XmlDoctype<'de>,
452 {
453 let _ = doctype;
454 Err(Error::unexpected_visit(Unexpected::DocType, &self))
455 }
456
457 fn visit_none<E>(self) -> Result<Self::Value, E>
459 where
460 E: Error,
461 {
462 Err(Error::unexpected_visit(Unexpected::None, &self))
463 }
464}
465
466pub trait Deserializer<'de>: Sized {
468 type Error: Error;
470
471 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
473 where
474 V: Visitor<'de>;
475
476 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
478 where
479 V: Visitor<'de>;
480}
481
482pub trait Deserialize<'de>: Sized {
486 fn deserialize<D: Deserializer<'de>>(reader: D) -> Result<Self, D::Error>;
488
489 fn deserialize_seq<D: Deserializer<'de>>(reader: D) -> Result<Self, D::Error> {
491 Self::deserialize(reader)
492 }
493}
494
495pub trait DeserializeOwned: for<'de> Deserialize<'de> {}
497impl<T> DeserializeOwned for T where T: for<'de> Deserialize<'de> {}
498
499pub trait DeserializationGroup<'de> {
503 type Builder: DeserializationGroupBuilder<'de, Value = Self>;
505
506 fn builder() -> Self::Builder;
508}
509
510pub trait DeserializationGroupBuilder<'de>: Sized {
512 type Value;
514
515 fn contribute_attributes<D: AttributesAccess<'de>>(
517 &mut self,
518 access: D,
519 ) -> Result<bool, D::Error> {
520 let _ = access;
521
522 Ok(false)
523 }
524
525 fn attributes_done(&self) -> bool {
527 false
528 }
529
530 fn contribute_elements<D: SeqAccess<'de>>(&mut self, access: D) -> Result<bool, D::Error> {
532 let _ = access;
533
534 Ok(false)
535 }
536
537 fn elements_done(&self) -> bool {
539 false
540 }
541
542 fn finish<E: Error>(self) -> Result<Self::Value, E>;
544}