1use std::{borrow::Cow, ops::Deref};
2
3use quick_xml::{
4 events::{
5 attributes::Attribute, BytesCData, BytesDecl, BytesEnd, BytesPI, BytesStart, BytesText,
6 Event,
7 },
8 name::QName as QuickName,
9 NsReader,
10};
11
12use xmlity::{
13 de::{
14 self, Error as _, NamespaceContext, Unexpected, Visitor, XmlCData, XmlComment,
15 XmlDeclaration, XmlDoctype, XmlProcessingInstruction, XmlText,
16 },
17 Deserialize, ExpandedName, LocalName, QName, XmlNamespace,
18};
19
20use crate::{xml_namespace_from_resolve_result, HasQuickXmlAlternative, OwnedQuickName};
21
22#[derive(Debug, thiserror::Error)]
24pub enum Error {
25 #[error("Quick XML error: {0}")]
27 QuickXml(#[from] quick_xml::Error),
28 #[error("Attribute error: {0}")]
30 AttrError(#[from] quick_xml::events::attributes::AttrError),
31 #[error("IO error: {0}")]
33 Io(#[from] std::io::Error),
34 #[error("Unexpected: {0}")]
36 Unexpected(xmlity::de::Unexpected),
37 #[error("Wrong name: expected {expected:?}, got {actual:?}")]
39 WrongName {
40 actual: Box<ExpandedName<'static>>,
42 expected: Box<ExpandedName<'static>>,
44 },
45 #[error("Unknown child")]
47 UnknownChild,
48 #[error("Invalid string")]
50 InvalidString,
51 #[error("Missing field: {field}")]
53 MissingField {
54 field: String,
56 },
57 #[error("No possible variant: {ident}")]
59 NoPossibleVariant {
60 ident: String,
62 },
63 #[error("Missing data")]
65 MissingData,
66 #[error("Custom: {0}")]
68 Custom(String),
69}
70
71impl xmlity::de::Error for Error {
72 fn custom<T: ToString>(msg: T) -> Self {
73 Error::Custom(msg.to_string())
74 }
75
76 fn wrong_name(actual: &ExpandedName<'_>, expected: &ExpandedName<'_>) -> Self {
77 Error::WrongName {
78 actual: Box::new(actual.as_ref().into_owned()),
79 expected: Box::new(expected.as_ref().into_owned()),
80 }
81 }
82
83 fn unexpected_visit<T>(unexpected: xmlity::de::Unexpected, _expected: &T) -> Self {
84 Error::Unexpected(unexpected)
85 }
86
87 fn missing_field(field: &str) -> Self {
88 Error::MissingField {
89 field: field.to_string(),
90 }
91 }
92
93 fn no_possible_variant(ident: &str) -> Self {
94 Error::NoPossibleVariant {
95 ident: ident.to_string(),
96 }
97 }
98
99 fn missing_data() -> Self {
100 Error::MissingData
101 }
102
103 fn unknown_child() -> Self {
104 Error::UnknownChild
105 }
106
107 fn invalid_string() -> Self {
108 Error::InvalidString
109 }
110}
111
112pub fn from_str<'a, T>(s: &'a str) -> Result<T, Error>
114where
115 T: Deserialize<'a>,
116{
117 let mut deserializer = Deserializer::from(s.as_bytes());
118 T::deserialize(&mut deserializer)
119}
120
121#[derive(Debug, Clone)]
125pub struct Deserializer<'i> {
126 reader: NsReader<&'i [u8]>,
127 current_depth: i16,
128 peeked_event: Option<Event<'i>>,
129}
130
131impl<'i> From<NsReader<&'i [u8]>> for Deserializer<'i> {
132 fn from(reader: NsReader<&'i [u8]>) -> Self {
133 Self::new(reader)
134 }
135}
136
137impl<'i> From<&'i [u8]> for Deserializer<'i> {
138 fn from(buffer: &'i [u8]) -> Self {
139 Self::new(NsReader::from_reader(buffer))
140 }
141}
142
143impl<'i> Deserializer<'i> {
144 pub fn new(reader: NsReader<&'i [u8]>) -> Self {
146 Self {
147 reader,
148 current_depth: 0,
149 peeked_event: None,
150 }
151 }
152
153 fn read_event(&mut self) -> Result<Option<Event<'i>>, Error> {
154 match self.reader.read_event()? {
155 Event::Eof => Ok(None),
156 event => Ok(Some(event)),
157 }
158 }
159
160 fn read_until_element_end(
161 &mut self,
162 name: quick_xml::name::QName,
163 depth: i16,
164 ) -> Result<(), Error> {
165 while let Some(event) = self.peek_event() {
166 let correct_name = match event {
167 Event::End(ref e) if e.name() == name => true,
168 Event::Eof => return Err(Error::Unexpected(Unexpected::Eof)),
169 _ => false,
170 };
171
172 if correct_name && self.current_depth == depth {
173 return Ok(());
174 }
175
176 self.next_event();
177 }
178
179 Err(Error::Unexpected(de::Unexpected::Eof))
180 }
181
182 fn peek_event(&mut self) -> Option<&Event<'i>> {
183 if self.peeked_event.is_some() {
184 return self.peeked_event.as_ref();
185 }
186
187 self.peeked_event = self.read_event().ok().flatten();
188 self.peeked_event.as_ref()
189 }
190
191 fn next_event(&mut self) -> Option<Event<'i>> {
192 let event = if self.peeked_event.is_some() {
193 self.peeked_event.take()
194 } else {
195 self.read_event().ok().flatten()
196 };
197
198 if matches!(event, Some(Event::End(_))) {
199 self.current_depth -= 1;
200 }
201 if matches!(event, Some(Event::Start(_))) {
202 self.current_depth += 1;
203 }
204
205 event
206 }
207
208 fn create_sub_seq_access<'p>(&'p mut self) -> SubSeqAccess<'p, 'i> {
209 SubSeqAccess::Filled {
210 current: Some(self.clone()),
211 parent: self,
212 }
213 }
214
215 fn try_deserialize<T, E>(
216 &mut self,
217 closure: impl for<'a> FnOnce(&'a mut Deserializer<'i>) -> Result<T, E>,
218 ) -> Result<T, E> {
219 let mut sub_deserializer = self.clone();
220 let res = closure(&mut sub_deserializer);
221
222 if res.is_ok() {
223 *self = sub_deserializer;
224 }
225 res
226 }
227
228 fn resolve_qname<'a>(&'a self, qname: QuickName<'a>) -> ExpandedName<'a> {
229 let (resolve_result, _) = self.reader.resolve(qname, false);
230 let namespace = xml_namespace_from_resolve_result(resolve_result);
231
232 ExpandedName::new(LocalName::from_quick_xml(qname.local_name()), namespace)
233 }
234
235 fn resolve_bytes_start<'a>(&'a self, bytes_start: &'a BytesStart<'a>) -> ExpandedName<'a> {
236 self.resolve_qname(bytes_start.name())
237 }
238
239 fn resolve_attribute<'a>(&'a self, attribute: &'a Attribute<'a>) -> ExpandedName<'a> {
240 self.resolve_qname(attribute.key)
241 }
242}
243
244struct ElementAccess<'a, 'de> {
245 deserializer: Option<&'a mut Deserializer<'de>>,
246 attribute_index: usize,
247 bytes_start: Option<BytesStart<'de>>,
248 start_depth: i16,
249 empty: bool,
250}
251
252impl Drop for ElementAccess<'_, '_> {
253 fn drop(&mut self) {
254 self.try_end().ok();
255 }
256}
257
258impl<'r> ElementAccess<'_, 'r> {
259 fn deserializer(&self) -> &Deserializer<'r> {
260 self.deserializer
261 .as_ref()
262 .expect("Should not be called after ElementAccess has been consumed")
263 }
264
265 fn try_end(&mut self) -> Result<(), Error> {
266 if self.empty {
267 return Ok(());
268 }
269
270 if let Some(deserializer) = self.deserializer.as_mut() {
271 deserializer.read_until_element_end(
272 self.bytes_start
273 .as_ref()
274 .expect("Should be some if deserializer is some")
275 .name(),
276 self.start_depth,
277 )?;
278 }
279 Ok(())
280 }
281}
282
283impl NamespaceContext for &Deserializer<'_> {
284 fn resolve_prefix(&self, prefix: xmlity::Prefix<'_>) -> Option<XmlNamespace<'_>> {
285 let name = format!("{prefix}:a");
286 let (_, namespace) = self.resolve_qname(QuickName(name.as_bytes())).into_parts();
287
288 namespace.map(XmlNamespace::into_owned)
289 }
290}
291
292struct AttributeAccess<'a> {
293 name: ExpandedName<'a>,
294 value: &'a str,
295 deserializer: &'a Deserializer<'a>,
296}
297
298impl de::AttributeAccess<'_> for AttributeAccess<'_> {
299 type Error = Error;
300
301 type NamespaceContext<'b>
302 = &'b Deserializer<'b>
303 where
304 Self: 'b;
305
306 fn name(&self) -> ExpandedName<'_> {
307 self.name.as_ref()
308 }
309
310 fn value(&self) -> &str {
311 self.value
312 }
313
314 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
315 self.deserializer
316 }
317}
318
319struct EmptySeqAccess;
320
321impl<'de> de::SeqAccess<'de> for EmptySeqAccess {
322 type Error = Error;
323 type SubAccess<'s>
324 = EmptySeqAccess
325 where
326 Self: 's;
327
328 fn next_element_seq<T>(&mut self) -> Result<Option<T>, Self::Error>
329 where
330 T: Deserialize<'de>,
331 {
332 Ok(None)
333 }
334
335 fn next_element<T>(&mut self) -> Result<Option<T>, Self::Error>
336 where
337 T: Deserialize<'de>,
338 {
339 Ok(None)
340 }
341
342 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
343 Ok(EmptySeqAccess)
344 }
345}
346
347struct AttributeDeserializer<'a> {
348 name: ExpandedName<'a>,
349 value: &'a str,
350 deserializer: &'a Deserializer<'a>,
351}
352
353impl<'de> xmlity::Deserializer<'de> for AttributeDeserializer<'_> {
354 type Error = Error;
355
356 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
357 where
358 V: Visitor<'de>,
359 {
360 visitor.visit_attribute(AttributeAccess {
361 name: self.name,
362 value: self.value,
363 deserializer: self.deserializer,
364 })
365 }
366
367 fn deserialize_seq<V>(self, _: V) -> Result<V::Value, Self::Error>
368 where
369 V: Visitor<'de>,
370 {
371 Err(Self::Error::Unexpected(de::Unexpected::Seq))
372 }
373}
374
375struct SubAttributesAccess<'a, 'r> {
376 deserializer: &'a Deserializer<'r>,
377 bytes_start: &'a BytesStart<'r>,
378 attribute_index: usize,
379 write_attribute_to: &'a mut usize,
380}
381
382impl Drop for SubAttributesAccess<'_, '_> {
383 fn drop(&mut self) {
384 *self.write_attribute_to = self.attribute_index;
385 }
386}
387
388fn next_attribute<'a, 'de, T: Deserialize<'de>>(
389 deserializer: &'a Deserializer<'_>,
390 bytes_start: &'a BytesStart<'_>,
391 attribute_index: &'a mut usize,
392) -> Result<Option<T>, Error> {
393 while let Some(attribute) = bytes_start.attributes().nth(*attribute_index) {
394 let attribute = attribute?;
395
396 let key = deserializer.resolve_attribute(&attribute);
397
398 if key.namespace() == Some(&XmlNamespace::XMLNS) {
399 *attribute_index += 1;
400 continue;
401 }
402
403 let value =
404 std::str::from_utf8(&attribute.value).expect("attribute value should be valid utf8");
405
406 let deserializer = AttributeDeserializer {
407 name: key,
408 value,
409 deserializer,
410 };
411
412 let res = T::deserialize(deserializer)?;
413
414 *attribute_index += 1;
416
417 return Ok(Some(res));
418 }
419
420 Ok(None)
421}
422
423impl<'de> de::AttributesAccess<'de> for SubAttributesAccess<'_, 'de> {
424 type Error = Error;
425
426 type SubAccess<'a>
427 = SubAttributesAccess<'a, 'de>
428 where
429 Self: 'a;
430
431 fn next_attribute<T>(&mut self) -> Result<Option<T>, Self::Error>
432 where
433 T: Deserialize<'de>,
434 {
435 next_attribute(
436 self.deserializer,
437 self.bytes_start,
438 &mut self.attribute_index,
439 )
440 }
441
442 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
443 Ok(Self::SubAccess {
444 deserializer: self.deserializer,
445 bytes_start: self.bytes_start,
446 attribute_index: self.attribute_index,
447 write_attribute_to: self.write_attribute_to,
448 })
449 }
450}
451
452impl<'de> de::AttributesAccess<'de> for ElementAccess<'_, 'de> {
453 type Error = Error;
454
455 type SubAccess<'a>
456 = SubAttributesAccess<'a, 'de>
457 where
458 Self: 'a;
459
460 fn next_attribute<T>(&mut self) -> Result<Option<T>, Self::Error>
461 where
462 T: Deserialize<'de>,
463 {
464 next_attribute(
465 self.deserializer
466 .as_ref()
467 .expect("deserializer should be set"),
468 self.bytes_start
469 .as_ref()
470 .expect("bytes_start should be set"),
471 &mut self.attribute_index,
472 )
473 }
474
475 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
476 Ok(Self::SubAccess {
477 bytes_start: self
478 .bytes_start
479 .as_ref()
480 .expect("Should not be called after ElementAccess has been consumed"),
481 attribute_index: self.attribute_index,
482 write_attribute_to: &mut self.attribute_index,
483 deserializer: self
484 .deserializer
485 .as_ref()
486 .expect("Should not be called after ElementAccess has been consumed"),
487 })
488 }
489}
490
491impl<'a, 'de> de::ElementAccess<'de> for ElementAccess<'a, 'de> {
492 type ChildrenAccess = ChildrenAccess<'a, 'de>;
493 type NamespaceContext<'b>
494 = &'b Deserializer<'de>
495 where
496 Self: 'b;
497
498 fn name(&self) -> ExpandedName<'_> {
499 self.deserializer().resolve_bytes_start(
500 self.bytes_start
501 .as_ref()
502 .expect("bytes_start should be set"),
503 )
504 }
505
506 fn children(mut self) -> Result<Self::ChildrenAccess, Self::Error> {
507 Ok(if self.empty {
508 ChildrenAccess::Empty
509 } else {
510 let deserializer = self
511 .deserializer
512 .take()
513 .expect("Should not be called after ElementAccess has been consumed");
514
515 ChildrenAccess::Filled {
516 expected_end: self
517 .bytes_start
518 .take()
519 .expect("Should not be called after ElementAccess has been consumed"),
520 start_depth: self.start_depth,
521 deserializer,
522 }
523 })
524 }
525
526 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
527 self.deserializer()
528 }
529}
530
531enum ChildrenAccess<'a, 'de> {
532 Filled {
533 expected_end: BytesStart<'de>,
534 deserializer: &'a mut Deserializer<'de>,
535 start_depth: i16,
536 },
537 Empty,
538}
539
540impl Drop for ChildrenAccess<'_, '_> {
541 fn drop(&mut self) {
542 let ChildrenAccess::Filled {
543 expected_end,
544 deserializer,
545 start_depth,
546 } = self
547 else {
548 return;
549 };
550
551 deserializer
552 .read_until_element_end(expected_end.name(), *start_depth)
553 .unwrap();
554 }
555}
556
557impl ChildrenAccess<'_, '_> {
558 fn check_end<T>(
559 expected_end: &BytesStart,
560 bytes_end: &BytesEnd,
561 current_depth: i16,
562 start_depth: i16,
563 ) -> Result<Option<T>, Error> {
564 if expected_end.name() != bytes_end.name() && current_depth == start_depth {
565 return Err(Error::custom(format!(
566 "Expected end of element {}, found end of element {}",
567 QName::from_quick_xml(expected_end.name()),
568 QName::from_quick_xml(bytes_end.name())
569 )));
570 }
571 Ok(None)
572 }
573}
574
575impl<'r> de::SeqAccess<'r> for ChildrenAccess<'_, 'r> {
576 type Error = Error;
577
578 type SubAccess<'s>
579 = SubSeqAccess<'s, 'r>
580 where
581 Self: 's;
582
583 fn next_element<T>(&mut self) -> Result<Option<T>, Self::Error>
584 where
585 T: Deserialize<'r>,
586 {
587 let ChildrenAccess::Filled {
588 expected_end,
589 deserializer,
590 start_depth,
591 } = self
592 else {
593 return Ok(None);
594 };
595
596 if deserializer.peek_event().is_none() {
597 return Ok(None);
598 }
599
600 let current_depth = deserializer.current_depth;
601
602 if let Some(Event::End(bytes_end)) = deserializer.peek_event() {
603 return Self::check_end(expected_end, bytes_end, current_depth, *start_depth);
604 }
605
606 deserializer
607 .try_deserialize(|deserializer| Deserialize::<'r>::deserialize(deserializer))
608 .map(Some)
609 }
610
611 fn next_element_seq<T>(&mut self) -> Result<Option<T>, Self::Error>
612 where
613 T: Deserialize<'r>,
614 {
615 let ChildrenAccess::Filled {
616 expected_end,
617 deserializer,
618 start_depth,
619 } = self
620 else {
621 return Ok(None);
622 };
623
624 if deserializer.peek_event().is_none() {
625 return Ok(None);
626 }
627
628 let current_depth = deserializer.current_depth;
629
630 if let Some(Event::End(bytes_end)) = deserializer.peek_event() {
631 return Self::check_end(expected_end, bytes_end, current_depth, *start_depth);
632 }
633
634 deserializer
635 .try_deserialize(|deserializer| Deserialize::<'r>::deserialize_seq(deserializer))
636 .map(Some)
637 }
638
639 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
640 let ChildrenAccess::Filled { deserializer, .. } = self else {
641 return Ok(SubSeqAccess::Empty);
642 };
643
644 Ok(deserializer.create_sub_seq_access())
645 }
646}
647
648struct SeqAccess<'a, 'r> {
649 deserializer: &'a mut Deserializer<'r>,
650}
651
652#[allow(clippy::large_enum_variant)]
653enum SubSeqAccess<'p, 'r> {
654 Filled {
655 current: Option<Deserializer<'r>>,
656 parent: &'p mut Deserializer<'r>,
657 },
658 Empty,
659}
660
661impl Drop for SubSeqAccess<'_, '_> {
662 fn drop(&mut self) {
663 if let SubSeqAccess::Filled { current, parent } = self {
664 **parent = current.take().expect("SubSeqAccess dropped twice");
665 }
666 }
667}
668
669impl<'r> de::SeqAccess<'r> for SubSeqAccess<'_, 'r> {
670 type Error = Error;
671
672 type SubAccess<'s>
673 = SubSeqAccess<'s, 'r>
674 where
675 Self: 's;
676
677 fn next_element_seq<T>(&mut self) -> Result<Option<T>, Self::Error>
678 where
679 T: Deserialize<'r>,
680 {
681 let Self::Filled { current, .. } = self else {
682 return Ok(None);
683 };
684
685 let deserializer = current.as_mut().expect("SubSeqAccess used after drop");
686
687 if deserializer.peek_event().is_none() {
688 return Ok(None);
689 }
690
691 deserializer
692 .try_deserialize(|deserializer| Deserialize::<'r>::deserialize_seq(deserializer))
693 .map(Some)
694 }
695
696 fn next_element<T>(&mut self) -> Result<Option<T>, Self::Error>
697 where
698 T: Deserialize<'r>,
699 {
700 let Self::Filled { current, .. } = self else {
701 return Ok(None);
702 };
703
704 let deserializer = current.as_mut().expect("SubSeqAccess used after drop");
705
706 if deserializer.peek_event().is_none() {
707 return Ok(None);
708 }
709
710 deserializer
711 .try_deserialize(|deserializer| Deserialize::<'r>::deserialize(deserializer))
712 .map(Some)
713 }
714
715 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
716 let Self::Filled { current, .. } = self else {
717 return Ok(SubSeqAccess::Empty);
718 };
719
720 Ok(current
721 .as_mut()
722 .expect("SubSeqAccess used after drop")
723 .create_sub_seq_access())
724 }
725}
726
727impl<'r> de::SeqAccess<'r> for SeqAccess<'_, 'r> {
728 type Error = Error;
729
730 type SubAccess<'s>
731 = SubSeqAccess<'s, 'r>
732 where
733 Self: 's;
734
735 fn next_element_seq<T>(&mut self) -> Result<Option<T>, Self::Error>
736 where
737 T: Deserialize<'r>,
738 {
739 if self.deserializer.peek_event().is_none() {
740 return Ok(None);
741 }
742
743 self.deserializer
744 .try_deserialize(|deserializer| Deserialize::<'r>::deserialize_seq(deserializer))
745 .map(Some)
746 }
747
748 fn next_element<T>(&mut self) -> Result<Option<T>, Self::Error>
749 where
750 T: Deserialize<'r>,
751 {
752 if self.deserializer.peek_event().is_none() {
753 return Ok(None);
754 }
755
756 self.deserializer
757 .try_deserialize(|deserializer| Deserialize::<'r>::deserialize(deserializer))
758 .map(Some)
759 }
760
761 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
762 Ok(SubSeqAccess::Filled {
763 current: Some(self.deserializer.clone()),
764 parent: self.deserializer,
765 })
766 }
767}
768
769struct DataWithD<'a, T> {
770 data: T,
771 deserializer: &'a Deserializer<'a>,
772}
773
774impl<'a, T> DataWithD<'a, T> {
775 fn new(data: T, deserializer: &'a Deserializer<'a>) -> Self {
776 Self { data, deserializer }
777 }
778}
779
780impl<'de> XmlText<'de> for DataWithD<'_, BytesText<'de>> {
781 type NamespaceContext<'a>
782 = &'a Deserializer<'a>
783 where
784 Self: 'a;
785
786 fn into_bytes(self) -> Cow<'de, [u8]> {
787 self.data.into_inner()
788 }
789
790 fn as_bytes(&self) -> &[u8] {
791 self.data.deref()
792 }
793
794 fn into_string(self) -> Cow<'de, str> {
795 match self.data.into_inner() {
796 Cow::Borrowed(bytes) => Cow::Borrowed(std::str::from_utf8(bytes).unwrap()),
797 Cow::Owned(bytes) => Cow::Owned(std::string::String::from_utf8(bytes).unwrap()),
798 }
799 }
800
801 fn as_str(&self) -> &str {
802 std::str::from_utf8(self.data.deref()).unwrap()
803 }
804
805 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
806 self.deserializer
807 }
808}
809
810impl<'de> XmlCData<'de> for DataWithD<'_, BytesCData<'de>> {
811 type NamespaceContext<'a>
812 = &'a Deserializer<'a>
813 where
814 Self: 'a;
815
816 fn into_bytes(self) -> Cow<'de, [u8]> {
817 self.data.into_inner()
818 }
819
820 fn as_bytes(&self) -> &[u8] {
821 self.data.deref()
822 }
823
824 fn into_string(self) -> Cow<'de, str> {
825 match self.data.into_inner() {
826 Cow::Borrowed(bytes) => Cow::Borrowed(std::str::from_utf8(bytes).unwrap()),
827 Cow::Owned(bytes) => Cow::Owned(std::string::String::from_utf8(bytes).unwrap()),
828 }
829 }
830
831 fn as_str(&self) -> &str {
832 std::str::from_utf8(self.data.deref()).unwrap()
833 }
834
835 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
836 self.deserializer
837 }
838}
839
840impl<'de> XmlComment<'de> for DataWithD<'_, BytesText<'de>> {
841 type NamespaceContext<'a>
842 = &'a Deserializer<'a>
843 where
844 Self: 'a;
845
846 fn into_bytes(self) -> Cow<'de, [u8]> {
847 self.data.into_inner()
848 }
849
850 fn as_bytes(&self) -> &[u8] {
851 self.data.deref()
852 }
853
854 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
855 self.deserializer
856 }
857}
858
859struct ClearedByteDecl<'a> {
860 version: Cow<'a, [u8]>,
861 encoding: Option<Cow<'a, [u8]>>,
862 standalone: Option<Cow<'a, [u8]>>,
863}
864
865impl<'a> TryFrom<&'a BytesDecl<'a>> for ClearedByteDecl<'a> {
866 type Error = Error;
867
868 fn try_from(bytes_decl: &'a BytesDecl<'a>) -> Result<Self, Self::Error> {
869 Ok(Self {
870 version: bytes_decl.version()?,
871 encoding: match bytes_decl.encoding() {
872 Some(Ok(encoding)) => Some(encoding),
873 Some(Err(err)) => return Err(Error::QuickXml(err.into())),
874 None => None,
875 },
876 standalone: match bytes_decl.standalone() {
877 Some(Ok(standalone)) => Some(standalone),
878 Some(Err(err)) => return Err(Error::QuickXml(err.into())),
879 None => None,
880 },
881 })
882 }
883}
884
885impl XmlDeclaration for DataWithD<'_, ClearedByteDecl<'_>> {
886 type NamespaceContext<'a>
887 = &'a Deserializer<'a>
888 where
889 Self: 'a;
890
891 fn version(&self) -> &[u8] {
892 self.data.version.as_ref()
893 }
894
895 fn encoding(&self) -> Option<&[u8]> {
896 self.data.encoding.as_deref()
897 }
898
899 fn standalone(&self) -> Option<&[u8]> {
900 self.data.standalone.as_deref()
901 }
902
903 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
904 self.deserializer
905 }
906}
907
908impl XmlProcessingInstruction for DataWithD<'_, BytesPI<'_>> {
909 type NamespaceContext<'a>
910 = &'a Deserializer<'a>
911 where
912 Self: 'a;
913
914 fn target(&self) -> &[u8] {
915 self.data.target()
916 }
917
918 fn content(&self) -> &[u8] {
919 self.data.content()
920 }
921
922 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
923 self.deserializer
924 }
925}
926
927impl<'de> XmlDoctype<'de> for DataWithD<'_, BytesText<'de>> {
928 type NamespaceContext<'a>
929 = &'a Deserializer<'a>
930 where
931 Self: 'a;
932
933 fn into_bytes(self) -> Cow<'de, [u8]> {
934 self.data.into_inner()
935 }
936
937 fn as_bytes(&self) -> &[u8] {
938 self.data.deref()
939 }
940
941 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
942 self.deserializer
943 }
944}
945
946impl<'r> xmlity::Deserializer<'r> for &mut Deserializer<'r> {
947 type Error = Error;
948
949 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
950 where
951 V: de::Visitor<'r>,
952 {
953 let event = self.next_event().ok_or_else(|| Error::custom("EOF"))?;
954
955 match event {
956 Event::Start(bytes_start) => {
957 let element_name = OwnedQuickName(bytes_start.name().0.to_owned());
958
959 let value = Visitor::visit_element(
960 visitor,
961 ElementAccess {
962 bytes_start: Some(bytes_start),
963 start_depth: self.current_depth,
964 deserializer: Some(self),
965 empty: false,
966 attribute_index: 0,
967 },
968 )?;
969
970 let end_event = self.next_event().ok_or_else(|| Error::custom("EOF"))?;
971
972 let success = if let Event::End(bytes_end) = &end_event {
973 bytes_end.name() == element_name.as_ref()
974 } else {
975 false
976 };
977
978 if success {
979 Ok(value)
980 } else {
981 Err(Error::custom("No matching end element"))
982 }
983 }
984 Event::End(_bytes_end) => Err(Error::custom("Unexpected end element")),
985 Event::Empty(bytes_start) => visitor.visit_element(ElementAccess {
986 bytes_start: Some(bytes_start),
987 start_depth: self.current_depth,
988 deserializer: Some(self),
989 empty: true,
990 attribute_index: 0,
991 }),
992 Event::Text(bytes_text) => visitor.visit_text(DataWithD::new(bytes_text, self)),
993 Event::CData(bytes_cdata) => visitor.visit_cdata(DataWithD::new(bytes_cdata, self)),
994 Event::Comment(bytes_text) => visitor.visit_comment(DataWithD::new(bytes_text, self)),
995 Event::Decl(bytes_decl) => visitor.visit_decl(DataWithD::new(
996 ClearedByteDecl::try_from(&bytes_decl)?,
997 self,
998 )),
999 Event::PI(bytes_pi) => visitor.visit_pi(DataWithD::new(bytes_pi, self)),
1000 Event::DocType(bytes_text) => visitor.visit_doctype(DataWithD::new(bytes_text, self)),
1001 Event::Eof => Err(Error::custom("Unexpected EOF")),
1002 }
1003 }
1004
1005 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1006 where
1007 V: de::Visitor<'r>,
1008 {
1009 visitor.visit_seq(SeqAccess { deserializer: self })
1010 }
1011}
1012
1013impl<'r> xmlity::Deserializer<'r> for Deserializer<'r> {
1014 type Error = Error;
1015
1016 fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
1017 where
1018 V: de::Visitor<'r>,
1019 {
1020 (&mut self).deserialize_any(visitor)
1021 }
1022
1023 fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
1024 where
1025 V: de::Visitor<'r>,
1026 {
1027 (&mut self).deserialize_seq(visitor)
1028 }
1029}