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 DeserializeContext {
84 fn default_namespace(&self) -> Option<XmlNamespace<'_>>;
86
87 fn resolve_prefix(&self, prefix: Prefix<'_>) -> Option<XmlNamespace<'_>>;
89
90 fn external_data<T>(&self) -> Option<&T>
92 where
93 T: core::any::Any;
94}
95
96pub trait AttributesAccess<'de> {
98 type Error: Error;
100 type SubAccess<'a>: AttributesAccess<'de, Error = Self::Error> + 'a
102 where
103 Self: 'a;
104
105 fn next_attribute<T>(&mut self) -> Result<Option<T>, Self::Error>
107 where
108 T: Deserialize<'de>;
109
110 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error>;
112}
113
114impl<'de, T: AttributesAccess<'de>> AttributesAccess<'de> for &mut T {
115 type Error = T::Error;
116 type SubAccess<'a>
117 = T::SubAccess<'a>
118 where
119 Self: 'a;
120
121 fn next_attribute<D>(&mut self) -> Result<Option<D>, Self::Error>
122 where
123 D: Deserialize<'de>,
124 {
125 (*self).next_attribute()
126 }
127
128 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
129 (*self).sub_access()
130 }
131}
132
133pub trait ElementAccess<'de>: AttributesAccess<'de> {
135 type ChildrenAccess: SeqAccess<'de, Error = Self::Error>;
137
138 type DeserializeContext<'a>: DeserializeContext + 'a
140 where
141 Self: 'a;
142
143 fn name(&self) -> ExpandedName<'_>;
145
146 fn children(self) -> Result<Self::ChildrenAccess, Self::Error>;
148
149 fn context(&self) -> Self::DeserializeContext<'_>;
151}
152
153pub trait ElementAccessExt<'de>: ElementAccess<'de> {
155 fn ensure_name<E: Error>(&self, name: &ExpandedName) -> Result<(), E>;
157}
158
159impl<'de, T: ElementAccess<'de>> ElementAccessExt<'de> for T {
160 fn ensure_name<E: Error>(&self, name: &ExpandedName) -> Result<(), E> {
161 if self.name() == *name {
162 Ok(())
163 } else {
164 Err(Error::wrong_name(&self.name(), name))
165 }
166 }
167}
168
169pub trait AttributeAccess<'de> {
171 type Error: Error;
173
174 fn name(&self) -> ExpandedName<'_>;
176
177 fn value<T>(self) -> Result<T, Self::Error>
179 where
180 T: Deserialize<'de>;
181}
182
183pub trait AttributeAccessExt<'de>: AttributeAccess<'de> {
185 fn ensure_name<E: Error>(&self, name: &ExpandedName) -> Result<(), E>;
187}
188
189impl<'de, T: AttributeAccess<'de>> AttributeAccessExt<'de> for T {
190 fn ensure_name<E: Error>(&self, name: &ExpandedName) -> Result<(), E> {
191 if self.name() == *name {
192 Ok(())
193 } else {
194 Err(Error::wrong_name(&self.name(), name))
195 }
196 }
197}
198
199pub trait SeqAccess<'de> {
201 type Error: Error;
203
204 type SubAccess<'g>: SeqAccess<'de, Error = Self::Error>
206 where
207 Self: 'g;
208
209 fn next_element<T>(&mut self) -> Result<Option<T>, Self::Error>
211 where
212 T: Deserialize<'de>;
213
214 fn next_element_seq<T>(&mut self) -> Result<Option<T>, Self::Error>
216 where
217 T: Deserialize<'de>;
218
219 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error>;
221}
222
223impl<'de, T: SeqAccess<'de>> SeqAccess<'de> for &mut T {
224 type Error = T::Error;
225 type SubAccess<'g>
226 = T::SubAccess<'g>
227 where
228 Self: 'g;
229
230 fn next_element<U>(&mut self) -> Result<Option<U>, Self::Error>
231 where
232 U: Deserialize<'de>,
233 {
234 (*self).next_element()
235 }
236
237 fn next_element_seq<U>(&mut self) -> Result<Option<U>, Self::Error>
238 where
239 U: Deserialize<'de>,
240 {
241 (*self).next_element_seq()
242 }
243
244 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
245 (*self).sub_access()
246 }
247}
248
249pub trait XmlText<'de> {
251 type DeserializeContext<'a>: DeserializeContext + 'a
253 where
254 Self: 'a;
255
256 fn into_bytes(self) -> Cow<'de, [u8]>;
258
259 fn as_bytes(&self) -> &[u8];
261
262 fn into_string(self) -> Cow<'de, str>;
264
265 fn as_str(&self) -> &str;
267
268 fn context(&self) -> Self::DeserializeContext<'_>;
270}
271
272pub trait XmlCData<'de> {
274 type DeserializeContext<'a>: DeserializeContext + 'a
276 where
277 Self: 'a;
278
279 fn into_bytes(self) -> Cow<'de, [u8]>;
281
282 fn as_bytes(&self) -> &[u8];
284
285 fn into_string(self) -> Cow<'de, str>;
287
288 fn as_str(&self) -> &str;
290
291 fn context(&self) -> Self::DeserializeContext<'_>;
293}
294
295pub trait XmlProcessingInstruction {
297 type DeserializeContext<'a>: DeserializeContext + 'a
299 where
300 Self: 'a;
301
302 fn target(&self) -> &[u8];
304
305 fn content(&self) -> &[u8];
307
308 fn context(&self) -> Self::DeserializeContext<'_>;
310}
311
312pub trait XmlDeclaration {
314 type DeserializeContext<'a>: DeserializeContext + 'a
316 where
317 Self: 'a;
318
319 fn version(&self) -> &[u8];
321
322 fn encoding(&self) -> Option<&[u8]>;
324
325 fn standalone(&self) -> Option<&[u8]>;
327
328 fn context(&self) -> Self::DeserializeContext<'_>;
330}
331
332pub trait XmlComment<'de> {
334 type DeserializeContext<'a>: DeserializeContext + 'a
336 where
337 Self: 'a;
338
339 fn into_bytes(self) -> Cow<'de, [u8]>;
341
342 fn as_bytes(&self) -> &[u8];
344
345 fn context(&self) -> Self::DeserializeContext<'_>;
347}
348
349pub trait XmlDoctype<'de> {
351 type DeserializeContext<'a>: DeserializeContext + 'a
353 where
354 Self: 'a;
355
356 fn into_bytes(self) -> Cow<'de, [u8]>;
358
359 fn as_bytes(&self) -> &[u8];
361
362 fn context(&self) -> Self::DeserializeContext<'_>;
364}
365
366pub trait Visitor<'de>: Sized {
368 type Value: Deserialize<'de>;
370
371 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result;
373
374 fn visit_text<E, V>(self, value: V) -> Result<Self::Value, E>
376 where
377 E: Error,
378 V: XmlText<'de>,
379 {
380 let _ = value;
381 Err(Error::unexpected_visit(Unexpected::Text, &self))
382 }
383
384 fn visit_cdata<E, V>(self, value: V) -> Result<Self::Value, E>
386 where
387 E: Error,
388 V: XmlCData<'de>,
389 {
390 let _ = value;
391 Err(Error::unexpected_visit(Unexpected::CData, &self))
392 }
393
394 fn visit_element<A>(self, element: A) -> Result<Self::Value, A::Error>
396 where
397 A: ElementAccess<'de>,
398 {
399 let _ = element;
400 Err(Error::unexpected_visit(Unexpected::ElementStart, &self))
401 }
402
403 fn visit_attribute<A>(self, attribute: A) -> Result<Self::Value, A::Error>
405 where
406 A: AttributeAccess<'de>,
407 {
408 let _ = attribute;
409 Err(Error::unexpected_visit(Unexpected::Attribute, &self))
410 }
411
412 fn visit_seq<S>(self, mut sequence: S) -> Result<Self::Value, S::Error>
414 where
415 S: SeqAccess<'de>,
416 {
417 sequence
418 .next_element::<Self::Value>()?
419 .ok_or_else(Error::missing_data)
420 }
421
422 fn visit_pi<E, V>(self, pi: V) -> Result<Self::Value, E>
424 where
425 E: Error,
426 V: XmlProcessingInstruction,
427 {
428 let _ = pi;
429 Err(Error::unexpected_visit(Unexpected::PI, &self))
430 }
431
432 fn visit_decl<E, V>(self, declaration: V) -> Result<Self::Value, E>
434 where
435 E: Error,
436 V: XmlDeclaration,
437 {
438 let _ = declaration;
439 Err(Error::unexpected_visit(Unexpected::Decl, &self))
440 }
441
442 fn visit_comment<E, V>(self, comment: V) -> Result<Self::Value, E>
444 where
445 E: Error,
446 V: XmlComment<'de>,
447 {
448 let _ = comment;
449 Err(Error::unexpected_visit(Unexpected::Comment, &self))
450 }
451
452 fn visit_doctype<E, V>(self, doctype: V) -> Result<Self::Value, E>
454 where
455 E: Error,
456 V: XmlDoctype<'de>,
457 {
458 let _ = doctype;
459 Err(Error::unexpected_visit(Unexpected::DocType, &self))
460 }
461
462 fn visit_none<E>(self) -> Result<Self::Value, E>
464 where
465 E: Error,
466 {
467 Err(Error::unexpected_visit(Unexpected::None, &self))
468 }
469}
470
471pub trait Deserializer<'de>: Sized {
473 type Error: Error;
475
476 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
478 where
479 V: Visitor<'de>;
480
481 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
483 where
484 V: Visitor<'de>;
485}
486
487pub trait Deserialize<'de>: Sized {
491 fn deserialize<D: Deserializer<'de>>(reader: D) -> Result<Self, D::Error>;
493
494 fn deserialize_seq<D: Deserializer<'de>>(reader: D) -> Result<Self, D::Error> {
496 Self::deserialize(reader)
497 }
498}
499
500pub trait DeserializeOwned: for<'de> Deserialize<'de> {}
502impl<T> DeserializeOwned for T where T: for<'de> Deserialize<'de> {}
503
504pub trait DeserializationGroup<'de> {
508 type Builder: DeserializationGroupBuilder<'de, Value = Self>;
510
511 fn builder() -> Self::Builder;
513}
514
515pub trait DeserializationGroupBuilder<'de>: Sized {
517 type Value;
519
520 fn contribute_attributes<D: AttributesAccess<'de>>(
522 &mut self,
523 access: D,
524 ) -> Result<bool, D::Error> {
525 let _ = access;
526
527 Ok(false)
528 }
529
530 fn attributes_done(&self) -> bool {
532 false
533 }
534
535 fn contribute_elements<D: SeqAccess<'de>>(&mut self, access: D) -> Result<bool, D::Error> {
537 let _ = access;
538
539 Ok(false)
540 }
541
542 fn elements_done(&self) -> bool {
544 false
545 }
546
547 fn finish<E: Error>(self) -> Result<Self::Value, E>;
549}