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>, attribute: bool) -> ExpandedName<'a> {
229 let (resolve_result, _) = self.reader.resolve(qname, attribute);
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(), false)
237 }
238
239 fn resolve_attribute<'a>(&'a self, attribute: &'a Attribute<'a>) -> ExpandedName<'a> {
240 self.resolve_qname(attribute.key, true)
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 default_namespace(&self) -> Option<XmlNamespace<'_>> {
285 let name = format!("a");
286 let (_, namespace) = self
287 .resolve_qname(QuickName(name.as_bytes()), false)
288 .into_parts();
289
290 namespace.map(XmlNamespace::into_owned)
291 }
292
293 fn resolve_prefix(&self, prefix: xmlity::Prefix<'_>) -> Option<XmlNamespace<'_>> {
294 let name = format!("{prefix}:a");
295 let (_, namespace) = self
296 .resolve_qname(QuickName(name.as_bytes()), false)
297 .into_parts();
298
299 namespace.map(XmlNamespace::into_owned)
300 }
301}
302
303struct AttributeAccess<'a, 'v> {
304 name: ExpandedName<'v>,
305 value: Cow<'v, [u8]>,
306 deserializer: &'a Deserializer<'a>,
307}
308
309impl<'de> de::AttributeAccess<'de> for AttributeAccess<'_, 'de> {
310 type Error = Error;
311
312 fn name(&self) -> ExpandedName<'de> {
313 self.name.clone()
314 }
315
316 fn value<T>(self) -> Result<T, Self::Error>
318 where
319 T: Deserialize<'de>,
320 {
321 T::deserialize(TextDeserializer {
322 value: self.value,
323 deserializer: self.deserializer,
324 })
325 }
326}
327
328struct TextDeserializer<'a, 'v> {
329 value: Cow<'v, [u8]>,
330 deserializer: &'a Deserializer<'a>,
331}
332
333impl<'de> de::XmlText<'de> for TextDeserializer<'_, 'de> {
334 type NamespaceContext<'a>
335 = &'a Deserializer<'a>
336 where
337 Self: 'a;
338
339 fn into_bytes(self) -> Cow<'de, [u8]> {
340 self.value
341 }
342
343 fn as_bytes(&self) -> &[u8] {
344 self.value.as_ref()
345 }
346
347 fn into_string(self) -> Cow<'de, str> {
348 match self.value {
349 Cow::Borrowed(bytes) => Cow::Borrowed(std::str::from_utf8(bytes).unwrap()),
350 Cow::Owned(_) => Cow::Owned(String::from_utf8(self.value.into_owned()).unwrap()),
351 }
352 }
353
354 fn as_str(&self) -> &str {
355 std::str::from_utf8(self.value.as_ref()).unwrap()
356 }
357
358 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
359 self.deserializer
360 }
361}
362
363impl<'de> de::Deserializer<'de> for TextDeserializer<'_, 'de> {
364 type Error = Error;
365
366 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
367 where
368 V: Visitor<'de>,
369 {
370 visitor.visit_text(self)
371 }
372
373 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
374 where
375 V: Visitor<'de>,
376 {
377 visitor.visit_text(self)
378 }
379}
380
381struct EmptySeqAccess;
382
383impl<'de> de::SeqAccess<'de> for EmptySeqAccess {
384 type Error = Error;
385 type SubAccess<'s>
386 = EmptySeqAccess
387 where
388 Self: 's;
389
390 fn next_element_seq<T>(&mut self) -> Result<Option<T>, Self::Error>
391 where
392 T: Deserialize<'de>,
393 {
394 Ok(None)
395 }
396
397 fn next_element<T>(&mut self) -> Result<Option<T>, Self::Error>
398 where
399 T: Deserialize<'de>,
400 {
401 Ok(None)
402 }
403
404 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
405 Ok(EmptySeqAccess)
406 }
407}
408
409struct AttributeDeserializer<'a, 'v> {
410 name: ExpandedName<'v>,
411 value: Cow<'v, [u8]>,
412 deserializer: &'a Deserializer<'a>,
413}
414
415impl<'de> xmlity::Deserializer<'de> for AttributeDeserializer<'_, 'de> {
416 type Error = Error;
417
418 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
419 where
420 V: Visitor<'de>,
421 {
422 visitor.visit_attribute(AttributeAccess {
423 name: self.name,
424 value: self.value,
425 deserializer: self.deserializer,
426 })
427 }
428
429 fn deserialize_seq<V>(self, _: V) -> Result<V::Value, Self::Error>
430 where
431 V: Visitor<'de>,
432 {
433 Err(Self::Error::Unexpected(de::Unexpected::Seq))
434 }
435}
436
437struct SubAttributesAccess<'a, 'r> {
438 deserializer: &'a Deserializer<'r>,
439 bytes_start: &'a BytesStart<'r>,
440 attribute_index: usize,
441 write_attribute_to: &'a mut usize,
442}
443
444impl Drop for SubAttributesAccess<'_, '_> {
445 fn drop(&mut self) {
446 *self.write_attribute_to = self.attribute_index;
447 }
448}
449
450fn key_is_declaration(key: &ExpandedName) -> bool {
451 key.namespace() == Some(&XmlNamespace::XMLNS)
452 || (key.local_name() == &LocalName::new_dangerous("xmlns") && key.namespace().is_none())
453}
454
455fn next_attribute<'a, 'de, T: Deserialize<'de>>(
456 deserializer: &'a Deserializer<'_>,
457 bytes_start: &'a BytesStart<'_>,
458 attribute_index: &'a mut usize,
459) -> Result<Option<T>, Error> {
460 while let Some(attribute) = bytes_start.attributes().nth(*attribute_index) {
461 let attribute = attribute?;
462
463 let key = deserializer.resolve_attribute(&attribute).into_owned();
464
465 if key_is_declaration(&key) {
466 *attribute_index += 1;
467 continue;
468 }
469
470 let deserializer: AttributeDeserializer<'_, 'static> = AttributeDeserializer {
471 name: key,
472 value: Cow::Owned(attribute.value.into_owned()),
473 deserializer,
474 };
475
476 let res = T::deserialize(deserializer)?;
477
478 *attribute_index += 1;
480
481 return Ok(Some(res));
482 }
483
484 Ok(None)
485}
486
487impl<'de> de::AttributesAccess<'de> for SubAttributesAccess<'_, 'de> {
488 type Error = Error;
489
490 type SubAccess<'a>
491 = SubAttributesAccess<'a, 'de>
492 where
493 Self: 'a;
494
495 fn next_attribute<T>(&mut self) -> Result<Option<T>, Self::Error>
496 where
497 T: Deserialize<'de>,
498 {
499 next_attribute(
500 self.deserializer,
501 self.bytes_start,
502 &mut self.attribute_index,
503 )
504 }
505
506 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
507 Ok(Self::SubAccess {
508 deserializer: self.deserializer,
509 bytes_start: self.bytes_start,
510 attribute_index: self.attribute_index,
511 write_attribute_to: self.write_attribute_to,
512 })
513 }
514}
515
516impl<'de> de::AttributesAccess<'de> for ElementAccess<'_, 'de> {
517 type Error = Error;
518
519 type SubAccess<'a>
520 = SubAttributesAccess<'a, 'de>
521 where
522 Self: 'a;
523
524 fn next_attribute<T>(&mut self) -> Result<Option<T>, Self::Error>
525 where
526 T: Deserialize<'de>,
527 {
528 next_attribute(
529 self.deserializer
530 .as_ref()
531 .expect("deserializer should be set"),
532 self.bytes_start
533 .as_ref()
534 .expect("bytes_start should be set"),
535 &mut self.attribute_index,
536 )
537 }
538
539 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
540 Ok(Self::SubAccess {
541 bytes_start: self
542 .bytes_start
543 .as_ref()
544 .expect("Should not be called after ElementAccess has been consumed"),
545 attribute_index: self.attribute_index,
546 write_attribute_to: &mut self.attribute_index,
547 deserializer: self
548 .deserializer
549 .as_ref()
550 .expect("Should not be called after ElementAccess has been consumed"),
551 })
552 }
553}
554
555impl<'a, 'de> de::ElementAccess<'de> for ElementAccess<'a, 'de> {
556 type ChildrenAccess = ChildrenAccess<'a, 'de>;
557 type NamespaceContext<'b>
558 = &'b Deserializer<'de>
559 where
560 Self: 'b;
561
562 fn name(&self) -> ExpandedName<'_> {
563 self.deserializer().resolve_bytes_start(
564 self.bytes_start
565 .as_ref()
566 .expect("bytes_start should be set"),
567 )
568 }
569
570 fn children(mut self) -> Result<Self::ChildrenAccess, Self::Error> {
571 Ok(if self.empty {
572 ChildrenAccess::Empty
573 } else {
574 let deserializer = self
575 .deserializer
576 .take()
577 .expect("Should not be called after ElementAccess has been consumed");
578
579 ChildrenAccess::Filled {
580 expected_end: self
581 .bytes_start
582 .take()
583 .expect("Should not be called after ElementAccess has been consumed"),
584 start_depth: self.start_depth,
585 deserializer,
586 }
587 })
588 }
589
590 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
591 self.deserializer()
592 }
593}
594
595enum ChildrenAccess<'a, 'de> {
596 Filled {
597 expected_end: BytesStart<'de>,
598 deserializer: &'a mut Deserializer<'de>,
599 start_depth: i16,
600 },
601 Empty,
602}
603
604impl Drop for ChildrenAccess<'_, '_> {
605 fn drop(&mut self) {
606 let ChildrenAccess::Filled {
607 expected_end,
608 deserializer,
609 start_depth,
610 } = self
611 else {
612 return;
613 };
614
615 deserializer
616 .read_until_element_end(expected_end.name(), *start_depth)
617 .unwrap();
618 }
619}
620
621impl ChildrenAccess<'_, '_> {
622 fn check_end<T>(
623 expected_end: &BytesStart,
624 bytes_end: &BytesEnd,
625 current_depth: i16,
626 start_depth: i16,
627 ) -> Result<Option<T>, Error> {
628 if expected_end.name() != bytes_end.name() && current_depth == start_depth {
629 return Err(Error::custom(format!(
630 "Expected end of element {}, found end of element {}",
631 QName::from_quick_xml(expected_end.name()),
632 QName::from_quick_xml(bytes_end.name())
633 )));
634 }
635 Ok(None)
636 }
637}
638
639impl<'r> de::SeqAccess<'r> for ChildrenAccess<'_, 'r> {
640 type Error = Error;
641
642 type SubAccess<'s>
643 = SubSeqAccess<'s, 'r>
644 where
645 Self: 's;
646
647 fn next_element<T>(&mut self) -> Result<Option<T>, Self::Error>
648 where
649 T: Deserialize<'r>,
650 {
651 let ChildrenAccess::Filled {
652 expected_end,
653 deserializer,
654 start_depth,
655 } = self
656 else {
657 return Ok(None);
658 };
659
660 if deserializer.peek_event().is_none() {
661 return Ok(None);
662 }
663
664 let current_depth = deserializer.current_depth;
665
666 if let Some(Event::End(bytes_end)) = deserializer.peek_event() {
667 return Self::check_end(expected_end, bytes_end, current_depth, *start_depth);
668 }
669
670 deserializer
671 .try_deserialize(|deserializer| Deserialize::<'r>::deserialize(deserializer))
672 .map(Some)
673 }
674
675 fn next_element_seq<T>(&mut self) -> Result<Option<T>, Self::Error>
676 where
677 T: Deserialize<'r>,
678 {
679 let ChildrenAccess::Filled {
680 expected_end,
681 deserializer,
682 start_depth,
683 } = self
684 else {
685 return Ok(None);
686 };
687
688 if deserializer.peek_event().is_none() {
689 return Ok(None);
690 }
691
692 let current_depth = deserializer.current_depth;
693
694 if let Some(Event::End(bytes_end)) = deserializer.peek_event() {
695 return Self::check_end(expected_end, bytes_end, current_depth, *start_depth);
696 }
697
698 deserializer
699 .try_deserialize(|deserializer| Deserialize::<'r>::deserialize_seq(deserializer))
700 .map(Some)
701 }
702
703 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
704 let ChildrenAccess::Filled { deserializer, .. } = self else {
705 return Ok(SubSeqAccess::Empty);
706 };
707
708 Ok(deserializer.create_sub_seq_access())
709 }
710}
711
712struct SeqAccess<'a, 'r> {
713 deserializer: &'a mut Deserializer<'r>,
714}
715
716#[allow(clippy::large_enum_variant)]
717enum SubSeqAccess<'p, 'r> {
718 Filled {
719 current: Option<Deserializer<'r>>,
720 parent: &'p mut Deserializer<'r>,
721 },
722 Empty,
723}
724
725impl Drop for SubSeqAccess<'_, '_> {
726 fn drop(&mut self) {
727 if let SubSeqAccess::Filled { current, parent } = self {
728 **parent = current.take().expect("SubSeqAccess dropped twice");
729 }
730 }
731}
732
733impl<'r> de::SeqAccess<'r> for SubSeqAccess<'_, 'r> {
734 type Error = Error;
735
736 type SubAccess<'s>
737 = SubSeqAccess<'s, 'r>
738 where
739 Self: 's;
740
741 fn next_element_seq<T>(&mut self) -> Result<Option<T>, Self::Error>
742 where
743 T: Deserialize<'r>,
744 {
745 let Self::Filled { current, .. } = self else {
746 return Ok(None);
747 };
748
749 let deserializer = current.as_mut().expect("SubSeqAccess used after drop");
750
751 if deserializer.peek_event().is_none() {
752 return Ok(None);
753 }
754
755 deserializer
756 .try_deserialize(|deserializer| Deserialize::<'r>::deserialize_seq(deserializer))
757 .map(Some)
758 }
759
760 fn next_element<T>(&mut self) -> Result<Option<T>, Self::Error>
761 where
762 T: Deserialize<'r>,
763 {
764 let Self::Filled { current, .. } = self else {
765 return Ok(None);
766 };
767
768 let deserializer = current.as_mut().expect("SubSeqAccess used after drop");
769
770 if deserializer.peek_event().is_none() {
771 return Ok(None);
772 }
773
774 deserializer
775 .try_deserialize(|deserializer| Deserialize::<'r>::deserialize(deserializer))
776 .map(Some)
777 }
778
779 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
780 let Self::Filled { current, .. } = self else {
781 return Ok(SubSeqAccess::Empty);
782 };
783
784 Ok(current
785 .as_mut()
786 .expect("SubSeqAccess used after drop")
787 .create_sub_seq_access())
788 }
789}
790
791impl<'r> de::SeqAccess<'r> for SeqAccess<'_, 'r> {
792 type Error = Error;
793
794 type SubAccess<'s>
795 = SubSeqAccess<'s, 'r>
796 where
797 Self: 's;
798
799 fn next_element_seq<T>(&mut self) -> Result<Option<T>, Self::Error>
800 where
801 T: Deserialize<'r>,
802 {
803 if self.deserializer.peek_event().is_none() {
804 return Ok(None);
805 }
806
807 self.deserializer
808 .try_deserialize(|deserializer| Deserialize::<'r>::deserialize_seq(deserializer))
809 .map(Some)
810 }
811
812 fn next_element<T>(&mut self) -> Result<Option<T>, Self::Error>
813 where
814 T: Deserialize<'r>,
815 {
816 if self.deserializer.peek_event().is_none() {
817 return Ok(None);
818 }
819
820 self.deserializer
821 .try_deserialize(|deserializer| Deserialize::<'r>::deserialize(deserializer))
822 .map(Some)
823 }
824
825 fn sub_access(&mut self) -> Result<Self::SubAccess<'_>, Self::Error> {
826 Ok(SubSeqAccess::Filled {
827 current: Some(self.deserializer.clone()),
828 parent: self.deserializer,
829 })
830 }
831}
832
833struct DataWithD<'a, T> {
834 data: T,
835 deserializer: &'a Deserializer<'a>,
836}
837
838impl<'a, T> DataWithD<'a, T> {
839 fn new(data: T, deserializer: &'a Deserializer<'a>) -> Self {
840 Self { data, deserializer }
841 }
842}
843
844impl<'de> XmlText<'de> for DataWithD<'_, BytesText<'de>> {
845 type NamespaceContext<'a>
846 = &'a Deserializer<'a>
847 where
848 Self: 'a;
849
850 fn into_bytes(self) -> Cow<'de, [u8]> {
851 self.data.into_inner()
852 }
853
854 fn as_bytes(&self) -> &[u8] {
855 self.data.deref()
856 }
857
858 fn into_string(self) -> Cow<'de, str> {
859 match self.data.into_inner() {
860 Cow::Borrowed(bytes) => Cow::Borrowed(std::str::from_utf8(bytes).unwrap()),
861 Cow::Owned(bytes) => Cow::Owned(std::string::String::from_utf8(bytes).unwrap()),
862 }
863 }
864
865 fn as_str(&self) -> &str {
866 std::str::from_utf8(self.data.deref()).unwrap()
867 }
868
869 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
870 self.deserializer
871 }
872}
873
874impl<'de> XmlCData<'de> for DataWithD<'_, BytesCData<'de>> {
875 type NamespaceContext<'a>
876 = &'a Deserializer<'a>
877 where
878 Self: 'a;
879
880 fn into_bytes(self) -> Cow<'de, [u8]> {
881 self.data.into_inner()
882 }
883
884 fn as_bytes(&self) -> &[u8] {
885 self.data.deref()
886 }
887
888 fn into_string(self) -> Cow<'de, str> {
889 match self.data.into_inner() {
890 Cow::Borrowed(bytes) => Cow::Borrowed(std::str::from_utf8(bytes).unwrap()),
891 Cow::Owned(bytes) => Cow::Owned(std::string::String::from_utf8(bytes).unwrap()),
892 }
893 }
894
895 fn as_str(&self) -> &str {
896 std::str::from_utf8(self.data.deref()).unwrap()
897 }
898
899 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
900 self.deserializer
901 }
902}
903
904impl<'de> XmlComment<'de> for DataWithD<'_, BytesText<'de>> {
905 type NamespaceContext<'a>
906 = &'a Deserializer<'a>
907 where
908 Self: 'a;
909
910 fn into_bytes(self) -> Cow<'de, [u8]> {
911 self.data.into_inner()
912 }
913
914 fn as_bytes(&self) -> &[u8] {
915 self.data.deref()
916 }
917
918 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
919 self.deserializer
920 }
921}
922
923struct ClearedByteDecl<'a> {
924 version: Cow<'a, [u8]>,
925 encoding: Option<Cow<'a, [u8]>>,
926 standalone: Option<Cow<'a, [u8]>>,
927}
928
929impl<'a> TryFrom<&'a BytesDecl<'a>> for ClearedByteDecl<'a> {
930 type Error = Error;
931
932 fn try_from(bytes_decl: &'a BytesDecl<'a>) -> Result<Self, Self::Error> {
933 Ok(Self {
934 version: bytes_decl.version()?,
935 encoding: match bytes_decl.encoding() {
936 Some(Ok(encoding)) => Some(encoding),
937 Some(Err(err)) => return Err(Error::QuickXml(err.into())),
938 None => None,
939 },
940 standalone: match bytes_decl.standalone() {
941 Some(Ok(standalone)) => Some(standalone),
942 Some(Err(err)) => return Err(Error::QuickXml(err.into())),
943 None => None,
944 },
945 })
946 }
947}
948
949impl XmlDeclaration for DataWithD<'_, ClearedByteDecl<'_>> {
950 type NamespaceContext<'a>
951 = &'a Deserializer<'a>
952 where
953 Self: 'a;
954
955 fn version(&self) -> &[u8] {
956 self.data.version.as_ref()
957 }
958
959 fn encoding(&self) -> Option<&[u8]> {
960 self.data.encoding.as_deref()
961 }
962
963 fn standalone(&self) -> Option<&[u8]> {
964 self.data.standalone.as_deref()
965 }
966
967 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
968 self.deserializer
969 }
970}
971
972impl XmlProcessingInstruction for DataWithD<'_, BytesPI<'_>> {
973 type NamespaceContext<'a>
974 = &'a Deserializer<'a>
975 where
976 Self: 'a;
977
978 fn target(&self) -> &[u8] {
979 self.data.target()
980 }
981
982 fn content(&self) -> &[u8] {
983 self.data.content()
984 }
985
986 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
987 self.deserializer
988 }
989}
990
991impl<'de> XmlDoctype<'de> for DataWithD<'_, BytesText<'de>> {
992 type NamespaceContext<'a>
993 = &'a Deserializer<'a>
994 where
995 Self: 'a;
996
997 fn into_bytes(self) -> Cow<'de, [u8]> {
998 self.data.into_inner()
999 }
1000
1001 fn as_bytes(&self) -> &[u8] {
1002 self.data.deref()
1003 }
1004
1005 fn namespace_context(&self) -> Self::NamespaceContext<'_> {
1006 self.deserializer
1007 }
1008}
1009
1010impl<'r> xmlity::Deserializer<'r> for &mut Deserializer<'r> {
1011 type Error = Error;
1012
1013 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1014 where
1015 V: de::Visitor<'r>,
1016 {
1017 let event = self.next_event().ok_or_else(|| Error::custom("EOF"))?;
1018
1019 match event {
1020 Event::Start(bytes_start) => {
1021 let element_name = OwnedQuickName(bytes_start.name().0.to_owned());
1022
1023 let value = Visitor::visit_element(
1024 visitor,
1025 ElementAccess {
1026 bytes_start: Some(bytes_start),
1027 start_depth: self.current_depth,
1028 deserializer: Some(self),
1029 empty: false,
1030 attribute_index: 0,
1031 },
1032 )?;
1033
1034 let end_event = self.next_event().ok_or_else(|| Error::custom("EOF"))?;
1035
1036 let success = if let Event::End(bytes_end) = &end_event {
1037 bytes_end.name() == element_name.as_ref()
1038 } else {
1039 false
1040 };
1041
1042 if success {
1043 Ok(value)
1044 } else {
1045 Err(Error::custom("No matching end element"))
1046 }
1047 }
1048 Event::End(_bytes_end) => Err(Error::custom("Unexpected end element")),
1049 Event::Empty(bytes_start) => visitor.visit_element(ElementAccess {
1050 bytes_start: Some(bytes_start),
1051 start_depth: self.current_depth,
1052 deserializer: Some(self),
1053 empty: true,
1054 attribute_index: 0,
1055 }),
1056 Event::Text(bytes_text) => visitor.visit_text(DataWithD::new(bytes_text, self)),
1057 Event::CData(bytes_cdata) => visitor.visit_cdata(DataWithD::new(bytes_cdata, self)),
1058 Event::Comment(bytes_text) => visitor.visit_comment(DataWithD::new(bytes_text, self)),
1059 Event::Decl(bytes_decl) => visitor.visit_decl(DataWithD::new(
1060 ClearedByteDecl::try_from(&bytes_decl)?,
1061 self,
1062 )),
1063 Event::PI(bytes_pi) => visitor.visit_pi(DataWithD::new(bytes_pi, self)),
1064 Event::DocType(bytes_text) => visitor.visit_doctype(DataWithD::new(bytes_text, self)),
1065 Event::Eof => Err(Error::custom("Unexpected EOF")),
1066 }
1067 }
1068
1069 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1070 where
1071 V: de::Visitor<'r>,
1072 {
1073 visitor.visit_seq(SeqAccess { deserializer: self })
1074 }
1075}
1076
1077impl<'r> xmlity::Deserializer<'r> for Deserializer<'r> {
1078 type Error = Error;
1079
1080 fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
1081 where
1082 V: de::Visitor<'r>,
1083 {
1084 (&mut self).deserialize_any(visitor)
1085 }
1086
1087 fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
1088 where
1089 V: de::Visitor<'r>,
1090 {
1091 (&mut self).deserialize_seq(visitor)
1092 }
1093}