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