1use crate::error::{Error, Result};
7use crate::reader::{XmlEvent, XmlReader};
8use serde::de::{self, DeserializeSeed, MapAccess, SeqAccess, Visitor};
9
10pub fn from_str<'de, T>(s: &'de str) -> Result<T>
30where
31 T: de::Deserialize<'de>,
32{
33 let mut de = Deserializer::from_str(s);
34 T::deserialize(&mut de)
35}
36
37pub fn from_bytes<'de, T>(bytes: &'de [u8]) -> Result<T>
39where
40 T: de::Deserialize<'de>,
41{
42 let s = std::str::from_utf8(bytes)
43 .map_err(|_| Error::new(crate::error::ErrorKind::InvalidUtf8))?;
44 from_str(s)
45}
46
47pub struct Deserializer<'de> {
49 reader: XmlReader<'de>,
50 peeked: Option<XmlEvent<'de>>,
52 pending_value: Option<String>,
54 start_consumed: bool,
56 is_empty_element: bool,
58}
59
60impl<'de> Deserializer<'de> {
61 #[allow(clippy::should_implement_trait)]
63 pub fn from_str(s: &'de str) -> Self {
64 Self {
65 reader: XmlReader::from_str(s),
66 peeked: None,
67 pending_value: None,
68 start_consumed: false,
69 is_empty_element: false,
70 }
71 }
72
73 fn peek_event(&mut self) -> Result<&XmlEvent<'de>> {
75 if self.peeked.is_none() {
76 self.peeked = Some(self.reader.next_event()?);
77 }
78 Ok(self.peeked.as_ref().unwrap())
79 }
80
81 fn next_event(&mut self) -> Result<XmlEvent<'de>> {
83 if let Some(event) = self.peeked.take() {
84 Ok(event)
85 } else {
86 self.reader.next_event()
87 }
88 }
89
90 fn read_text_content(&mut self) -> Result<String> {
92 let mut content = String::new();
93
94 loop {
95 match self.peek_event()? {
96 XmlEvent::Text(text) => {
97 content.push_str(text);
98 self.next_event()?;
99 }
100 XmlEvent::CData(data) => {
101 content.push_str(data);
102 self.next_event()?;
103 }
104 _ => break,
105 }
106 }
107
108 Ok(content)
109 }
110
111 fn read_element_text(&mut self) -> Result<String> {
113 if self.is_empty_element {
114 self.is_empty_element = false;
115 self.start_consumed = false;
116 return Ok(String::new());
117 }
118
119 let content = self.read_text_content()?;
120
121 if self.start_consumed {
123 self.start_consumed = false;
124 if let XmlEvent::EndElement { .. } = self.peek_event()? {
125 self.next_event()?;
126 }
127 }
128
129 Ok(content)
130 }
131
132 fn skip_element(&mut self) -> Result<()> {
134 let mut depth = 1;
135 while depth > 0 {
136 match self.next_event()? {
137 XmlEvent::StartElement { .. } => depth += 1,
138 XmlEvent::EndElement { .. } => depth -= 1,
139 XmlEvent::EmptyElement { .. } => {}
140 XmlEvent::Eof => return Err(Error::unexpected_eof()),
141 _ => {}
142 }
143 }
144 Ok(())
145 }
146
147 fn parse_value<T>(&self, s: &str) -> Result<T>
149 where
150 T: std::str::FromStr,
151 T::Err: std::fmt::Display,
152 {
153 s.parse()
154 .map_err(|e: T::Err| Error::invalid_value(e.to_string()))
155 }
156
157 fn get_text(&mut self) -> Result<String> {
159 if let Some(value) = self.pending_value.take() {
160 return Ok(value);
161 }
162
163 if self.start_consumed {
165 return self.read_element_text();
166 }
167
168 match self.peek_event()? {
170 XmlEvent::StartElement { .. } => {
171 self.next_event()?;
172 self.start_consumed = true;
173 self.is_empty_element = false;
174 self.read_element_text()
175 }
176 XmlEvent::EmptyElement { .. } => {
177 self.next_event()?;
178 Ok(String::new())
179 }
180 _ => self.read_text_content(),
181 }
182 }
183}
184
185impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> {
186 type Error = Error;
187
188 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
189 where
190 V: Visitor<'de>,
191 {
192 if let Some(value) = self.pending_value.take() {
193 return visitor.visit_string(value);
194 }
195
196 match self.peek_event()? {
197 XmlEvent::StartElement { .. } | XmlEvent::EmptyElement { .. } => {
198 self.deserialize_map(visitor)
199 }
200 XmlEvent::Text(text) => {
201 let text = text.clone().into_owned();
202 self.next_event()?;
203 visitor.visit_string(text)
204 }
205 XmlEvent::CData(data) => {
206 let data = data.clone().into_owned();
207 self.next_event()?;
208 visitor.visit_string(data)
209 }
210 XmlEvent::EndElement { .. } => visitor.visit_unit(),
211 XmlEvent::Eof => visitor.visit_unit(),
212 _ => {
213 self.next_event()?;
214 self.deserialize_any(visitor)
215 }
216 }
217 }
218
219 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
220 where
221 V: Visitor<'de>,
222 {
223 let text = self.get_text()?;
224 match text.as_str() {
225 "true" | "1" | "yes" => visitor.visit_bool(true),
226 "false" | "0" | "no" => visitor.visit_bool(false),
227 _ => Err(Error::invalid_value(format!("expected boolean, got '{}'", text))),
228 }
229 }
230
231 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
232 where
233 V: Visitor<'de>,
234 {
235 let text = self.get_text()?;
236 visitor.visit_i8(self.parse_value(&text)?)
237 }
238
239 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
240 where
241 V: Visitor<'de>,
242 {
243 let text = self.get_text()?;
244 visitor.visit_i16(self.parse_value(&text)?)
245 }
246
247 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
248 where
249 V: Visitor<'de>,
250 {
251 let text = self.get_text()?;
252 visitor.visit_i32(self.parse_value(&text)?)
253 }
254
255 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
256 where
257 V: Visitor<'de>,
258 {
259 let text = self.get_text()?;
260 visitor.visit_i64(self.parse_value(&text)?)
261 }
262
263 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
264 where
265 V: Visitor<'de>,
266 {
267 let text = self.get_text()?;
268 visitor.visit_u8(self.parse_value(&text)?)
269 }
270
271 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
272 where
273 V: Visitor<'de>,
274 {
275 let text = self.get_text()?;
276 visitor.visit_u16(self.parse_value(&text)?)
277 }
278
279 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
280 where
281 V: Visitor<'de>,
282 {
283 let text = self.get_text()?;
284 visitor.visit_u32(self.parse_value(&text)?)
285 }
286
287 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
288 where
289 V: Visitor<'de>,
290 {
291 let text = self.get_text()?;
292 visitor.visit_u64(self.parse_value(&text)?)
293 }
294
295 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
296 where
297 V: Visitor<'de>,
298 {
299 let text = self.get_text()?;
300 visitor.visit_f32(self.parse_value(&text)?)
301 }
302
303 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
304 where
305 V: Visitor<'de>,
306 {
307 let text = self.get_text()?;
308 visitor.visit_f64(self.parse_value(&text)?)
309 }
310
311 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
312 where
313 V: Visitor<'de>,
314 {
315 let text = self.get_text()?;
316 let mut chars = text.chars();
317 match (chars.next(), chars.next()) {
318 (Some(c), None) => visitor.visit_char(c),
319 _ => Err(Error::invalid_value("expected single character")),
320 }
321 }
322
323 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
324 where
325 V: Visitor<'de>,
326 {
327 self.deserialize_string(visitor)
328 }
329
330 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
331 where
332 V: Visitor<'de>,
333 {
334 let text = self.get_text()?;
335 visitor.visit_string(text)
336 }
337
338 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
339 where
340 V: Visitor<'de>,
341 {
342 let text = self.get_text()?;
343 visitor.visit_bytes(text.as_bytes())
344 }
345
346 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
347 where
348 V: Visitor<'de>,
349 {
350 self.deserialize_bytes(visitor)
351 }
352
353 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
354 where
355 V: Visitor<'de>,
356 {
357 if self.pending_value.is_some() || self.start_consumed {
358 return visitor.visit_some(self);
359 }
360
361 match self.peek_event()? {
362 XmlEvent::EndElement { .. } | XmlEvent::Eof => visitor.visit_none(),
363 _ => visitor.visit_some(self),
364 }
365 }
366
367 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
368 where
369 V: Visitor<'de>,
370 {
371 self.pending_value = None;
372 if self.start_consumed && !self.is_empty_element {
373 if let XmlEvent::EndElement { .. } = self.peek_event()? {
375 self.next_event()?;
376 }
377 }
378 self.start_consumed = false;
379 self.is_empty_element = false;
380 visitor.visit_unit()
381 }
382
383 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
384 where
385 V: Visitor<'de>,
386 {
387 if self.start_consumed {
388 if !self.is_empty_element {
389 loop {
391 match self.next_event()? {
392 XmlEvent::EndElement { .. } => break,
393 XmlEvent::Eof => break,
394 _ => {}
395 }
396 }
397 }
398 self.start_consumed = false;
399 self.is_empty_element = false;
400 return visitor.visit_unit();
401 }
402
403 match self.peek_event()? {
404 XmlEvent::EmptyElement { .. } => {
405 self.next_event()?;
406 }
407 XmlEvent::StartElement { .. } => {
408 self.next_event()?;
409 loop {
410 match self.next_event()? {
411 XmlEvent::EndElement { .. } => break,
412 XmlEvent::Eof => break,
413 _ => {}
414 }
415 }
416 }
417 _ => {}
418 }
419 visitor.visit_unit()
420 }
421
422 fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
423 where
424 V: Visitor<'de>,
425 {
426 visitor.visit_newtype_struct(self)
427 }
428
429 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
430 where
431 V: Visitor<'de>,
432 {
433 visitor.visit_seq(SeqDeserializer::new(self))
434 }
435
436 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
437 where
438 V: Visitor<'de>,
439 {
440 self.deserialize_seq(visitor)
441 }
442
443 fn deserialize_tuple_struct<V>(
444 self,
445 _name: &'static str,
446 _len: usize,
447 visitor: V,
448 ) -> Result<V::Value>
449 where
450 V: Visitor<'de>,
451 {
452 self.deserialize_seq(visitor)
453 }
454
455 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
456 where
457 V: Visitor<'de>,
458 {
459 let (attrs, is_empty) = if self.start_consumed {
461 self.start_consumed = false;
462 let is_empty = self.is_empty_element;
463 self.is_empty_element = false;
464 (vec![], is_empty)
465 } else {
466 match self.next_event()? {
468 XmlEvent::StartElement { attributes, .. } => {
469 let attrs: Vec<_> = attributes
470 .into_iter()
471 .map(|a| (a.name.into_owned(), a.value.into_owned()))
472 .collect();
473 (attrs, false)
474 }
475 XmlEvent::EmptyElement { attributes, .. } => {
476 let attrs: Vec<_> = attributes
477 .into_iter()
478 .map(|a| (a.name.into_owned(), a.value.into_owned()))
479 .collect();
480 (attrs, true)
481 }
482 XmlEvent::Eof => (vec![], true),
483 _ => (vec![], false),
484 }
485 };
486
487 let result = visitor.visit_map(MapDeserializer {
488 de: self,
489 attrs,
490 attr_idx: 0,
491 finished: is_empty,
492 })?;
493
494 if !is_empty {
496 loop {
497 match self.peek_event()? {
498 XmlEvent::EndElement { .. } => {
499 self.next_event()?;
500 break;
501 }
502 XmlEvent::Eof => break,
503 _ => {
504 self.next_event()?;
505 }
506 }
507 }
508 }
509
510 Ok(result)
511 }
512
513 fn deserialize_struct<V>(
514 self,
515 _name: &'static str,
516 _fields: &'static [&'static str],
517 visitor: V,
518 ) -> Result<V::Value>
519 where
520 V: Visitor<'de>,
521 {
522 self.deserialize_map(visitor)
523 }
524
525 fn deserialize_enum<V>(
526 self,
527 _name: &'static str,
528 _variants: &'static [&'static str],
529 visitor: V,
530 ) -> Result<V::Value>
531 where
532 V: Visitor<'de>,
533 {
534 visitor.visit_enum(EnumDeserializer::new(self))
535 }
536
537 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
538 where
539 V: Visitor<'de>,
540 {
541 self.deserialize_string(visitor)
542 }
543
544 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
545 where
546 V: Visitor<'de>,
547 {
548 self.pending_value = None;
549
550 if self.start_consumed {
551 if !self.is_empty_element {
552 self.skip_element()?;
553 }
554 self.start_consumed = false;
555 self.is_empty_element = false;
556 return visitor.visit_unit();
557 }
558
559 match self.peek_event()? {
560 XmlEvent::StartElement { .. } => {
561 self.next_event()?;
562 self.skip_element()?;
563 }
564 XmlEvent::EmptyElement { .. } => {
565 self.next_event()?;
566 }
567 XmlEvent::Text(_) | XmlEvent::CData(_) => {
568 self.next_event()?;
569 }
570 _ => {}
571 }
572 visitor.visit_unit()
573 }
574}
575
576struct SeqDeserializer<'a, 'de> {
578 de: &'a mut Deserializer<'de>,
579 element_name: Option<String>,
580}
581
582impl<'a, 'de> SeqDeserializer<'a, 'de> {
583 fn new(de: &'a mut Deserializer<'de>) -> Self {
584 Self {
585 de,
586 element_name: None,
587 }
588 }
589}
590
591impl<'de, 'a> SeqAccess<'de> for SeqDeserializer<'a, 'de> {
592 type Error = Error;
593
594 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
595 where
596 T: DeserializeSeed<'de>,
597 {
598 loop {
599 match self.de.peek_event()? {
600 XmlEvent::StartElement { name, .. } | XmlEvent::EmptyElement { name, .. } => {
601 let current_name = name.clone().into_owned();
602
603 if let Some(ref expected) = self.element_name {
604 if ¤t_name != expected {
605 return Ok(None);
606 }
607 } else {
608 self.element_name = Some(current_name);
609 }
610
611 return seed.deserialize(&mut *self.de).map(Some);
612 }
613 XmlEvent::EndElement { .. } | XmlEvent::Eof => return Ok(None),
614 XmlEvent::Text(_) | XmlEvent::CData(_) => {
615 return seed.deserialize(&mut *self.de).map(Some);
616 }
617 _ => {
618 self.de.next_event()?;
619 }
620 }
621 }
622 }
623}
624
625struct MapDeserializer<'a, 'de> {
627 de: &'a mut Deserializer<'de>,
628 attrs: Vec<(String, String)>,
629 attr_idx: usize,
630 finished: bool,
631}
632
633impl<'de, 'a> MapAccess<'de> for MapDeserializer<'a, 'de> {
634 type Error = Error;
635
636 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
637 where
638 K: DeserializeSeed<'de>,
639 {
640 if self.attr_idx < self.attrs.len() {
642 let (name, _) = &self.attrs[self.attr_idx];
643 self.de.pending_value = Some(format!("@{}", name));
645 return seed.deserialize(&mut *self.de).map(Some);
646 }
647
648 if self.finished {
649 return Ok(None);
650 }
651
652 loop {
654 match self.de.peek_event()? {
655 XmlEvent::StartElement { name, .. } | XmlEvent::EmptyElement { name, .. } => {
656 let name = name.clone().into_owned();
657 self.de.pending_value = Some(name);
659 return seed.deserialize(&mut *self.de).map(Some);
660 }
661 XmlEvent::EndElement { .. } | XmlEvent::Eof => {
662 self.finished = true;
663 return Ok(None);
664 }
665 XmlEvent::Text(_) | XmlEvent::CData(_) => {
666 self.de.pending_value = Some("$value".to_string());
667 return seed.deserialize(&mut *self.de).map(Some);
668 }
669 _ => {
670 self.de.next_event()?;
671 }
672 }
673 }
674 }
675
676 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
677 where
678 V: DeserializeSeed<'de>,
679 {
680 if self.attr_idx < self.attrs.len() {
682 let (_, value) = &self.attrs[self.attr_idx];
683 self.attr_idx += 1;
684 self.de.pending_value = Some(value.clone());
685 return seed.deserialize(&mut *self.de);
686 }
687
688 seed.deserialize(&mut *self.de)
690 }
691}
692
693struct EnumDeserializer<'a, 'de> {
695 de: &'a mut Deserializer<'de>,
696}
697
698impl<'a, 'de> EnumDeserializer<'a, 'de> {
699 fn new(de: &'a mut Deserializer<'de>) -> Self {
700 Self { de }
701 }
702}
703
704impl<'de, 'a> de::EnumAccess<'de> for EnumDeserializer<'a, 'de> {
705 type Error = Error;
706 type Variant = Self;
707
708 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
709 where
710 V: DeserializeSeed<'de>,
711 {
712 if self.de.pending_value.is_some() {
714 let variant = seed.deserialize(&mut *self.de)?;
715 return Ok((variant, self));
716 }
717
718 match self.de.peek_event()? {
720 XmlEvent::StartElement { name, .. } | XmlEvent::EmptyElement { name, .. } => {
721 let name = name.clone().into_owned();
722 self.de.pending_value = Some(name);
723 }
724 XmlEvent::Text(text) => {
725 let text = text.clone().into_owned();
726 self.de.pending_value = Some(text);
727 }
728 _ => {}
729 }
730
731 let variant = seed.deserialize(&mut *self.de)?;
732 Ok((variant, self))
733 }
734}
735
736impl<'de, 'a> de::VariantAccess<'de> for EnumDeserializer<'a, 'de> {
737 type Error = Error;
738
739 fn unit_variant(self) -> Result<()> {
740 if self.de.start_consumed {
741 if !self.de.is_empty_element {
742 self.de.skip_element()?;
743 }
744 self.de.start_consumed = false;
745 self.de.is_empty_element = false;
746 return Ok(());
747 }
748
749 match self.de.peek_event()? {
750 XmlEvent::EmptyElement { .. } => {
751 self.de.next_event()?;
752 }
753 XmlEvent::StartElement { .. } => {
754 self.de.next_event()?;
755 self.de.skip_element()?;
756 }
757 _ => {}
758 }
759 Ok(())
760 }
761
762 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
763 where
764 T: DeserializeSeed<'de>,
765 {
766 seed.deserialize(&mut *self.de)
767 }
768
769 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value>
770 where
771 V: Visitor<'de>,
772 {
773 de::Deserializer::deserialize_seq(&mut *self.de, visitor)
774 }
775
776 fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
777 where
778 V: Visitor<'de>,
779 {
780 de::Deserializer::deserialize_map(&mut *self.de, visitor)
781 }
782}
783
784#[cfg(test)]
785mod tests {
786 use super::*;
787 use serde::Deserialize;
788
789 #[test]
790 fn test_deserialize_simple_struct() {
791 #[derive(Debug, Deserialize, PartialEq)]
792 struct Person {
793 name: String,
794 age: u32,
795 }
796
797 let xml = "<Person><name>Alice</name><age>30</age></Person>";
798 let person: Person = from_str(xml).unwrap();
799 assert_eq!(person.name, "Alice");
800 assert_eq!(person.age, 30);
801 }
802
803 #[test]
804 fn test_deserialize_with_attributes() {
805 #[derive(Debug, Deserialize, PartialEq)]
806 struct Item {
807 #[serde(rename = "@id")]
808 id: String,
809 name: String,
810 }
811
812 let xml = r#"<Item id="123"><name>Widget</name></Item>"#;
813 let item: Item = from_str(xml).unwrap();
814 assert_eq!(item.id, "123");
815 assert_eq!(item.name, "Widget");
816 }
817
818 #[test]
819 fn test_deserialize_nested_struct() {
820 #[derive(Debug, Deserialize, PartialEq)]
821 struct Address {
822 city: String,
823 country: String,
824 }
825
826 #[derive(Debug, Deserialize, PartialEq)]
827 struct Person {
828 name: String,
829 address: Address,
830 }
831
832 let xml = r#"
833 <Person>
834 <name>Bob</name>
835 <address>
836 <city>New York</city>
837 <country>USA</country>
838 </address>
839 </Person>
840 "#;
841 let person: Person = from_str(xml).unwrap();
842 assert_eq!(person.name, "Bob");
843 assert_eq!(person.address.city, "New York");
844 }
845
846 #[test]
847 fn test_deserialize_optional() {
848 #[derive(Debug, Deserialize, PartialEq)]
849 struct Config {
850 name: String,
851 #[serde(default)]
852 value: Option<String>,
853 }
854
855 let xml1 = "<Config><name>test</name><value>val</value></Config>";
856 let config1: Config = from_str(xml1).unwrap();
857 assert_eq!(config1.value, Some("val".to_string()));
858
859 let xml2 = "<Config><name>test</name></Config>";
860 let config2: Config = from_str(xml2).unwrap();
861 assert_eq!(config2.value, None);
862 }
863
864 #[test]
865 fn test_deserialize_bool() {
866 #[derive(Debug, Deserialize, PartialEq)]
867 struct Flags {
868 enabled: bool,
869 active: bool,
870 }
871
872 let xml = "<Flags><enabled>true</enabled><active>false</active></Flags>";
873 let flags: Flags = from_str(xml).unwrap();
874 assert!(flags.enabled);
875 assert!(!flags.active);
876 }
877
878 #[test]
879 fn test_deserialize_numbers() {
880 #[derive(Debug, Deserialize, PartialEq)]
881 struct Numbers {
882 i: i32,
883 u: u64,
884 f: f64,
885 }
886
887 let xml = "<Numbers><i>-42</i><u>100</u><f>1.234</f></Numbers>";
888 let nums: Numbers = from_str(xml).unwrap();
889 assert_eq!(nums.i, -42);
890 assert_eq!(nums.u, 100);
891 assert!((nums.f - 1.234).abs() < 0.001);
892 }
893
894 #[test]
895 fn test_deserialize_vector() {
896 #[derive(Debug, Deserialize, PartialEq)]
897 struct Items {
898 item: Vec<String>,
899 }
900
901 let xml = r#"<Items><item>one</item><item>two</item><item>three</item></Items>"#;
902 let items: Items = from_str(xml).unwrap();
903 assert_eq!(items.item, vec!["one", "two", "three"]);
904 }
905
906 #[test]
907 fn test_deserialize_escaped_content() {
908 #[derive(Debug, Deserialize, PartialEq)]
909 struct Data {
910 content: String,
911 }
912
913 let xml = "<Data><content><hello> & "world"</content></Data>";
914 let data: Data = from_str(xml).unwrap();
915 assert_eq!(data.content, "<hello> & \"world\"");
916 }
917
918 #[test]
919 fn test_deserialize_empty_element() {
920 #[derive(Debug, Deserialize, PartialEq)]
921 struct Empty {
922 #[serde(default)]
923 value: String,
924 }
925
926 let xml = "<Empty><value></value></Empty>";
927 let empty: Empty = from_str(xml).unwrap();
928 assert_eq!(empty.value, "");
929 }
930
931 #[test]
932 fn test_deserialize_char() {
933 #[derive(Debug, Deserialize, PartialEq)]
934 struct Data {
935 c: char,
936 }
937
938 let xml = "<Data><c>A</c></Data>";
939 let data: Data = from_str(xml).unwrap();
940 assert_eq!(data.c, 'A');
941 }
942
943 #[test]
944 fn test_deserialize_unit_struct() {
945 #[derive(Debug, Deserialize, PartialEq)]
946 struct Unit;
947
948 let xml = "<Unit/>";
949 let _unit: Unit = from_str(xml).unwrap();
950 }
951
952 #[test]
953 fn test_from_bytes() {
954 #[derive(Debug, Deserialize, PartialEq)]
955 struct Data {
956 value: String,
957 }
958
959 let bytes = b"<Data><value>test</value></Data>";
960 let data: Data = from_bytes(bytes).unwrap();
961 assert_eq!(data.value, "test");
962 }
963
964 #[test]
965 fn test_deserialize_vector_of_structs() {
966 #[derive(Debug, Deserialize, PartialEq)]
967 struct Item {
968 name: String,
969 count: u32,
970 }
971
972 #[derive(Debug, Deserialize, PartialEq)]
973 struct Items {
974 item: Vec<Item>,
975 }
976
977 let xml = r#"<Items><item><name>A</name><count>1</count></item><item><name>B</name><count>2</count></item></Items>"#;
978 let items: Items = from_str(xml).unwrap();
979 assert_eq!(items.item.len(), 2);
980 assert_eq!(items.item[0].name, "A");
981 assert_eq!(items.item[1].name, "B");
982 }
983
984 #[test]
985 fn test_deserialize_multiple_attributes() {
986 #[derive(Debug, Deserialize, PartialEq)]
987 struct Element {
988 #[serde(rename = "@id")]
989 id: String,
990 #[serde(rename = "@class")]
991 class: String,
992 name: String,
993 }
994
995 let xml = r#"<Element id="main" class="container"><name>Test</name></Element>"#;
996 let elem: Element = from_str(xml).unwrap();
997 assert_eq!(elem.id, "main");
998 assert_eq!(elem.class, "container");
999 assert_eq!(elem.name, "Test");
1000 }
1001
1002 #[test]
1003 fn test_deserialize_attributes_with_special_chars() {
1004 #[derive(Debug, Deserialize, PartialEq)]
1005 struct Element {
1006 #[serde(rename = "@title")]
1007 title: String,
1008 }
1009
1010 let xml = r#"<Element title="Hello & "World""/>"#;
1011 let elem: Element = from_str(xml).unwrap();
1012 assert_eq!(elem.title, "Hello & \"World\"");
1013 }
1014
1015 #[test]
1016 fn test_deserialize_numeric_attributes() {
1017 #[derive(Debug, Deserialize, PartialEq)]
1018 struct Item {
1019 #[serde(rename = "@id")]
1020 id: u32,
1021 #[serde(rename = "@count")]
1022 count: i32,
1023 #[serde(rename = "@price")]
1024 price: f64,
1025 #[serde(rename = "@active")]
1026 active: bool,
1027 }
1028
1029 let xml = r#"<Item id="42" count="-10" price="19.99" active="true"/>"#;
1030 let item: Item = from_str(xml).unwrap();
1031 assert_eq!(item.id, 42);
1032 assert_eq!(item.count, -10);
1033 assert!((item.price - 19.99).abs() < 0.001);
1034 assert!(item.active);
1035 }
1036
1037 #[test]
1038 fn test_deserialize_empty_element_with_attributes() {
1039 #[derive(Debug, Deserialize, PartialEq)]
1040 struct Empty {
1041 #[serde(rename = "@id")]
1042 id: String,
1043 #[serde(default)]
1044 value: String,
1045 }
1046
1047 let xml = r#"<Empty id="test"/>"#;
1048 let elem: Empty = from_str(xml).unwrap();
1049 assert_eq!(elem.id, "test");
1050 assert_eq!(elem.value, "");
1051 }
1052
1053 #[test]
1054 fn test_deserialize_nested_with_attributes() {
1055 #[derive(Debug, Deserialize, PartialEq)]
1056 struct Child {
1057 #[serde(rename = "@name")]
1058 name: String,
1059 }
1060
1061 #[derive(Debug, Deserialize, PartialEq)]
1062 struct Parent {
1063 #[serde(rename = "@id")]
1064 id: String,
1065 child: Child,
1066 }
1067
1068 let xml = r#"<Parent id="p1"><child name="c1"/></Parent>"#;
1069 let parent: Parent = from_str(xml).unwrap();
1070 assert_eq!(parent.id, "p1");
1071 assert_eq!(parent.child.name, "c1");
1072 }
1073
1074 #[test]
1075 fn test_deserialize_vector_with_attributes() {
1076 #[derive(Debug, Deserialize, PartialEq)]
1077 struct Item {
1078 #[serde(rename = "@id")]
1079 id: u32,
1080 name: String,
1081 }
1082
1083 #[derive(Debug, Deserialize, PartialEq)]
1084 struct List {
1085 #[serde(rename = "@version")]
1086 version: String,
1087 item: Vec<Item>,
1088 }
1089
1090 let xml = r#"<List version="1.0"><item id="1"><name>A</name></item><item id="2"><name>B</name></item></List>"#;
1091 let list: List = from_str(xml).unwrap();
1092 assert_eq!(list.version, "1.0");
1093 assert_eq!(list.item.len(), 2);
1094 assert_eq!(list.item[0].id, 1);
1095 assert_eq!(list.item[1].id, 2);
1096 }
1097}