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