1use crate::ast::{XmlAttribute, XmlElement, XmlValue};
2use serde::{
3 de::{self, Visitor},
4 ser::{self, Serialize},
5};
6use std::fmt;
7
8#[derive(Debug)]
9pub struct Error(String);
10
11impl fmt::Display for Error {
12 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
13 write!(f, "{}", self.0)
14 }
15}
16
17impl std::error::Error for Error {}
18
19impl From<Error> for String {
20 fn from(e: Error) -> Self {
21 e.0
22 }
23}
24
25impl ser::Error for Error {
26 fn custom<T: fmt::Display>(msg: T) -> Self {
27 Error(msg.to_string())
28 }
29}
30
31impl de::Error for Error {
32 fn custom<T: fmt::Display>(msg: T) -> Self {
33 Error(msg.to_string())
34 }
35}
36
37pub struct Serializer;
38
39pub fn to_value<T: Serialize>(value: &T) -> Result<XmlValue, Error> {
40 value.serialize(Serializer)
41}
42
43pub fn from_value<T: de::DeserializeOwned>(value: XmlValue) -> Result<T, Error> {
44 T::deserialize(value)
45}
46
47impl ser::Serializer for Serializer {
48 type Ok = XmlValue;
49 type Error = Error;
50
51 type SerializeSeq = SerializeArray;
52 type SerializeTuple = SerializeArray;
53 type SerializeTupleStruct = SerializeArray;
54 type SerializeTupleVariant = SerializeVariant;
55 type SerializeMap = SerializeObject;
56 type SerializeStruct = SerializeObject;
57 type SerializeStructVariant = SerializeVariant;
58
59 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
60 Ok(XmlValue::Text(v.to_string()))
61 }
62
63 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
64 self.serialize_f64(v as f64)
65 }
66 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
67 self.serialize_f64(v as f64)
68 }
69 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
70 self.serialize_f64(v as f64)
71 }
72 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
73 self.serialize_f64(v as f64)
74 }
75 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
76 self.serialize_f64(v as f64)
77 }
78 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
79 self.serialize_f64(v as f64)
80 }
81 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
82 self.serialize_f64(v as f64)
83 }
84 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
85 self.serialize_f64(v as f64)
86 }
87 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
88 self.serialize_f64(v as f64)
89 }
90 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
91 Ok(XmlValue::Text(v.to_string()))
92 }
93
94 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
95 self.serialize_str(&v.to_string())
96 }
97
98 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
99 Ok(XmlValue::Text(v.to_string()))
100 }
101
102 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
103 let elements = v.iter().map(|&b| XmlValue::Text(b.to_string())).collect();
104 Ok(XmlValue::Element(XmlElement { name: "bytes".to_string(), attributes: Vec::new(), children: elements, span: (0..0).into() }))
105 }
106
107 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
108 Ok(XmlValue::Text(String::new()))
112 }
113
114 fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<Self::Ok, Self::Error> {
115 value.serialize(self)
116 }
117
118 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
119 self.serialize_none()
120 }
121
122 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
123 self.serialize_unit()
124 }
125
126 fn serialize_unit_variant(self, _name: &'static str, _variant_index: u32, variant: &'static str) -> Result<Self::Ok, Self::Error> {
127 self.serialize_str(variant)
128 }
129
130 fn serialize_newtype_struct<T: ?Sized + Serialize>(self, _name: &'static str, value: &T) -> Result<Self::Ok, Self::Error> {
131 value.serialize(self)
132 }
133
134 fn serialize_newtype_variant<T: ?Sized + Serialize>(self, _name: &'static str, _variant_index: u32, variant: &'static str, value: &T) -> Result<Self::Ok, Self::Error> {
135 let mut children = Vec::new();
136 children.push(value.serialize(self)?);
137 Ok(XmlValue::Element(XmlElement { name: variant.to_string(), attributes: Vec::new(), children, span: (0..0).into() }))
138 }
139
140 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
141 Ok(SerializeArray { elements: Vec::new() })
142 }
143
144 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
145 self.serialize_seq(Some(len))
146 }
147
148 fn serialize_tuple_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeTupleStruct, Self::Error> {
149 self.serialize_seq(Some(len))
150 }
151
152 fn serialize_tuple_variant(self, _name: &'static str, _variant_index: u32, variant: &'static str, _len: usize) -> Result<Self::SerializeTupleVariant, Self::Error> {
153 Ok(SerializeVariant { name: variant.to_string(), elements: Vec::new() })
154 }
155
156 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
157 Ok(SerializeObject {
158 name: "root".to_string(), attributes: Vec::new(),
160 children: Vec::new(),
161 current_key: None,
162 })
163 }
164
165 fn serialize_struct(self, name: &'static str, _len: usize) -> Result<Self::SerializeStruct, Self::Error> {
166 Ok(SerializeObject { name: name.to_string(), attributes: Vec::new(), children: Vec::new(), current_key: None })
167 }
168
169 fn serialize_struct_variant(self, _name: &'static str, _variant_index: u32, variant: &'static str, _len: usize) -> Result<Self::SerializeStructVariant, Self::Error> {
170 Ok(SerializeVariant { name: variant.to_string(), elements: Vec::new() })
171 }
172}
173
174pub struct SerializeArray {
175 elements: Vec<XmlValue>,
176}
177
178impl ser::SerializeSeq for SerializeArray {
179 type Ok = XmlValue;
180 type Error = Error;
181
182 fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
183 self.elements.push(value.serialize(Serializer)?);
184 Ok(())
185 }
186
187 fn end(self) -> Result<Self::Ok, Self::Error> {
188 Ok(XmlValue::Fragment(self.elements))
189 }
190}
191
192impl ser::SerializeTuple for SerializeArray {
193 type Ok = XmlValue;
194 type Error = Error;
195 fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
196 ser::SerializeSeq::serialize_element(self, value)
197 }
198 fn end(self) -> Result<Self::Ok, Self::Error> {
199 ser::SerializeSeq::end(self)
200 }
201}
202
203impl ser::SerializeTupleStruct for SerializeArray {
204 type Ok = XmlValue;
205 type Error = Error;
206 fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
207 ser::SerializeSeq::serialize_element(self, value)
208 }
209 fn end(self) -> Result<Self::Ok, Self::Error> {
210 ser::SerializeSeq::end(self)
211 }
212}
213
214pub struct SerializeVariant {
215 name: String,
216 elements: Vec<XmlValue>,
217}
218
219impl ser::SerializeTupleVariant for SerializeVariant {
220 type Ok = XmlValue;
221 type Error = Error;
222
223 fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
224 self.elements.push(value.serialize(Serializer)?);
225 Ok(())
226 }
227
228 fn end(self) -> Result<Self::Ok, Self::Error> {
229 Ok(XmlValue::Element(XmlElement { name: self.name, attributes: Vec::new(), children: self.elements, span: (0..0).into() }))
230 }
231}
232
233impl ser::SerializeStructVariant for SerializeVariant {
234 type Ok = XmlValue;
235 type Error = Error;
236
237 fn serialize_field<T: ?Sized + Serialize>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> {
238 let val = value.serialize(Serializer)?;
239 self.elements.push(XmlValue::Element(XmlElement { name: key.to_string(), attributes: Vec::new(), children: vec![val], span: (0..0).into() }));
240 Ok(())
241 }
242
243 fn end(self) -> Result<Self::Ok, Self::Error> {
244 Ok(XmlValue::Element(XmlElement { name: self.name, attributes: Vec::new(), children: self.elements, span: (0..0).into() }))
245 }
246}
247
248pub struct SerializeObject {
249 name: String,
250 attributes: Vec<XmlAttribute>,
251 children: Vec<XmlValue>,
252 current_key: Option<String>,
253}
254
255impl ser::SerializeMap for SerializeObject {
256 type Ok = XmlValue;
257 type Error = Error;
258
259 fn serialize_key<T: ?Sized + Serialize>(&mut self, key: &T) -> Result<(), Self::Error> {
260 self.current_key = Some(key.serialize(StringSerializer)?);
261 Ok(())
262 }
263
264 fn serialize_value<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
265 let key = self.current_key.take().unwrap();
266 let val = value.serialize(Serializer)?;
267
268 if key.starts_with('@') {
269 self.attributes.push(XmlAttribute {
270 name: key[1..].to_string(),
271 value: match val {
272 XmlValue::Text(t) => t,
273 XmlValue::Fragment(_) => return Err(ser::Error::custom("Cannot use fragment as attribute value")),
274 _ => val.as_str().unwrap_or("").to_string(),
275 },
276 span: (0..0).into(),
277 });
278 }
279 else if key == "$value" {
280 match val {
281 XmlValue::Fragment(elements) => {
282 self.children.extend(elements);
283 }
284 _ => {
285 self.children.push(val);
286 }
287 }
288 }
289 else {
290 match val {
291 XmlValue::Fragment(elements) => {
292 for element in elements {
293 match element {
294 XmlValue::Element(mut e) => {
295 e.name = key.clone();
296 self.children.push(XmlValue::Element(e));
297 }
298 _ => {
299 self.children.push(XmlValue::Element(XmlElement { name: key.clone(), attributes: Vec::new(), children: vec![element], span: (0..0).into() }));
300 }
301 }
302 }
303 }
304 XmlValue::Element(mut e) => {
305 e.name = key;
306 self.children.push(XmlValue::Element(e));
307 }
308 _ => {
309 self.children.push(XmlValue::Element(XmlElement { name: key, attributes: Vec::new(), children: vec![val], span: (0..0).into() }));
310 }
311 }
312 }
313 Ok(())
314 }
315
316 fn end(self) -> Result<Self::Ok, Self::Error> {
317 Ok(XmlValue::Element(XmlElement { name: self.name, attributes: self.attributes, children: self.children, span: (0..0).into() }))
318 }
319}
320
321impl ser::SerializeStruct for SerializeObject {
322 type Ok = XmlValue;
323 type Error = Error;
324
325 fn serialize_field<T: ?Sized + Serialize>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> {
326 ser::SerializeMap::serialize_key(self, key)?;
327 ser::SerializeMap::serialize_value(self, value)
328 }
329
330 fn end(self) -> Result<Self::Ok, Self::Error> {
331 ser::SerializeMap::end(self)
332 }
333}
334
335struct StringSerializer;
336
337impl ser::Serializer for StringSerializer {
338 type Ok = String;
339 type Error = Error;
340 type SerializeSeq = ser::Impossible<String, Error>;
341 type SerializeTuple = ser::Impossible<String, Error>;
342 type SerializeTupleStruct = ser::Impossible<String, Error>;
343 type SerializeTupleVariant = ser::Impossible<String, Error>;
344 type SerializeMap = ser::Impossible<String, Error>;
345 type SerializeStruct = ser::Impossible<String, Error>;
346 type SerializeStructVariant = ser::Impossible<String, Error>;
347
348 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
349 Ok(v.to_string())
350 }
351 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
352 Ok(v.to_string())
353 }
354 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
355 Ok(v.to_string())
356 }
357 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
358 Ok(v.to_string())
359 }
360 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
361 Ok(v.to_string())
362 }
363 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
364 Ok(v.to_string())
365 }
366 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
367 Ok(v.to_string())
368 }
369 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
370 Ok(v.to_string())
371 }
372 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
373 Ok(v.to_string())
374 }
375 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
376 Ok(v.to_string())
377 }
378 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
379 Ok(v.to_string())
380 }
381 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
382 Ok(v.to_string())
383 }
384 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
385 Ok(v.to_string())
386 }
387 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
388 Ok(format!("{:?}", v))
389 }
390 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
391 Ok(String::new())
392 }
393 fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<Self::Ok, Self::Error> {
394 value.serialize(self)
395 }
396 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
397 Ok(String::new())
398 }
399 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
400 Ok(String::new())
401 }
402 fn serialize_unit_variant(self, _name: &'static str, _variant_index: u32, variant: &'static str) -> Result<Self::Ok, Self::Error> {
403 Ok(variant.to_string())
404 }
405 fn serialize_newtype_struct<T: ?Sized + Serialize>(self, _name: &'static str, value: &T) -> Result<Self::Ok, Self::Error> {
406 value.serialize(self)
407 }
408 fn serialize_newtype_variant<T: ?Sized + Serialize>(self, _name: &'static str, _variant_index: u32, variant: &'static str, _value: &T) -> Result<Self::Ok, Self::Error> {
409 Ok(variant.to_string())
410 }
411 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
412 Err(ser::Error::custom("Impossible"))
413 }
414 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
415 Err(ser::Error::custom("Impossible"))
416 }
417 fn serialize_tuple_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeTupleStruct, Self::Error> {
418 Err(ser::Error::custom("Impossible"))
419 }
420 fn serialize_tuple_variant(self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize) -> Result<Self::SerializeTupleVariant, Self::Error> {
421 Err(ser::Error::custom("Impossible"))
422 }
423 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
424 Err(ser::Error::custom("Impossible"))
425 }
426 fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct, Self::Error> {
427 Err(ser::Error::custom("Impossible"))
428 }
429 fn serialize_struct_variant(self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize) -> Result<Self::SerializeStructVariant, Self::Error> {
430 Err(ser::Error::custom("Impossible"))
431 }
432}
433
434impl<'de> de::Deserializer<'de> for XmlValue {
435 type Error = Error;
436
437 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
438 where
439 V: Visitor<'de>,
440 {
441 match self {
442 XmlValue::Text(t) => visitor.visit_string(t),
443 XmlValue::Element(e) => visitor.visit_map(MapDeserializer::new(e)),
444 XmlValue::Fragment(fs) => visitor.visit_seq(SeqDeserializer::new(fs)),
445 _ => Err(de::Error::custom("Unsupported XML value type for deserialize_any")),
446 }
447 }
448
449 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
450 where
451 V: Visitor<'de>,
452 {
453 match self {
454 XmlValue::Text(ref t) if t.is_empty() => visitor.visit_none(),
455 _ => visitor.visit_some(self),
456 }
457 }
458
459 fn deserialize_enum<V>(self, _name: &'static str, _variants: &'static [&'static str], visitor: V) -> Result<V::Value, Self::Error>
460 where
461 V: Visitor<'de>,
462 {
463 match self {
464 XmlValue::Text(t) => visitor.visit_enum(EnumDeserializer::new(t, None)),
465 XmlValue::Element(e) => visitor.visit_enum(EnumDeserializer::new(e.name.clone(), Some(XmlValue::Element(e)))),
466 _ => Err(de::Error::custom("Expected text or element for enum")),
467 }
468 }
469
470 fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Self::Error>
471 where
472 V: Visitor<'de>,
473 {
474 visitor.visit_newtype_struct(self)
475 }
476
477 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
478 where
479 V: Visitor<'de>,
480 {
481 self.deserialize_any(visitor)
482 }
483 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
484 where
485 V: Visitor<'de>,
486 {
487 self.deserialize_any(visitor)
488 }
489 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
490 where
491 V: Visitor<'de>,
492 {
493 self.deserialize_any(visitor)
494 }
495 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
496 where
497 V: Visitor<'de>,
498 {
499 self.deserialize_any(visitor)
500 }
501 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
502 where
503 V: Visitor<'de>,
504 {
505 self.deserialize_any(visitor)
506 }
507 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
508 where
509 V: Visitor<'de>,
510 {
511 self.deserialize_any(visitor)
512 }
513 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
514 where
515 V: Visitor<'de>,
516 {
517 self.deserialize_any(visitor)
518 }
519 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
520 where
521 V: Visitor<'de>,
522 {
523 self.deserialize_any(visitor)
524 }
525 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
526 where
527 V: Visitor<'de>,
528 {
529 self.deserialize_any(visitor)
530 }
531 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
532 where
533 V: Visitor<'de>,
534 {
535 self.deserialize_any(visitor)
536 }
537 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
538 where
539 V: Visitor<'de>,
540 {
541 self.deserialize_any(visitor)
542 }
543 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
544 where
545 V: Visitor<'de>,
546 {
547 self.deserialize_any(visitor)
548 }
549 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
550 where
551 V: Visitor<'de>,
552 {
553 match self {
554 XmlValue::Text(t) => visitor.visit_string(t),
555 XmlValue::Element(e) => {
556 if e.attributes.is_empty() && e.children.iter().all(|c| matches!(c, XmlValue::Text(_))) {
557 let mut text = String::new();
558 for child in e.children {
559 if let XmlValue::Text(t) = child {
560 text.push_str(&t);
561 }
562 }
563 visitor.visit_string(text)
564 }
565 else {
566 XmlValue::Element(e).deserialize_any(visitor)
567 }
568 }
569 XmlValue::Fragment(fs) => {
570 let mut text = String::new();
571 for f in fs {
572 text.push_str(&f.to_string());
573 }
574 visitor.visit_string(text)
575 }
576 other => other.deserialize_any(visitor),
577 }
578 }
579
580 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
581 where
582 V: Visitor<'de>,
583 {
584 self.deserialize_str(visitor)
585 }
586 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
587 where
588 V: Visitor<'de>,
589 {
590 self.deserialize_any(visitor)
591 }
592 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
593 where
594 V: Visitor<'de>,
595 {
596 self.deserialize_any(visitor)
597 }
598 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
599 where
600 V: Visitor<'de>,
601 {
602 self.deserialize_any(visitor)
603 }
604 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Self::Error>
605 where
606 V: Visitor<'de>,
607 {
608 self.deserialize_any(visitor)
609 }
610 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
611 where
612 V: Visitor<'de>,
613 {
614 match self {
615 XmlValue::Element(e) => visitor.visit_seq(SeqDeserializer::new(e.children)),
616 XmlValue::Fragment(fs) => visitor.visit_seq(SeqDeserializer::new(fs)),
617 _ => Err(de::Error::custom("Expected element or fragment for seq")),
618 }
619 }
620 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
621 where
622 V: Visitor<'de>,
623 {
624 self.deserialize_seq(visitor)
625 }
626 fn deserialize_tuple_struct<V>(self, _name: &'static str, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
627 where
628 V: Visitor<'de>,
629 {
630 self.deserialize_seq(visitor)
631 }
632 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
633 where
634 V: Visitor<'de>,
635 {
636 self.deserialize_any(visitor)
637 }
638 fn deserialize_struct<V>(self, _name: &'static str, _fields: &'static [&'static str], visitor: V) -> Result<V::Value, Self::Error>
639 where
640 V: Visitor<'de>,
641 {
642 self.deserialize_any(visitor)
643 }
644 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
645 where
646 V: Visitor<'de>,
647 {
648 self.deserialize_any(visitor)
649 }
650 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
651 where
652 V: Visitor<'de>,
653 {
654 self.deserialize_any(visitor)
655 }
656}
657
658struct MapDeserializer {
659 entries: std::vec::IntoIter<(String, XmlValue)>,
660 current_value: Option<XmlValue>,
661}
662
663impl MapDeserializer {
664 fn new(element: XmlElement) -> Self {
665 let mut entries: Vec<(String, Vec<XmlValue>)> = Vec::new();
666
667 for attr in element.attributes {
668 let key = "@".to_string() + &attr.name;
669 entries.push((key, vec![XmlValue::Text(attr.value)]));
670 }
671
672 for child in element.children {
673 match child {
674 XmlValue::Element(e) => {
675 if let Some(entry) = entries.iter_mut().find(|(k, _)| k == &e.name) {
676 entry.1.push(XmlValue::Element(e));
677 }
678 else {
679 let name = e.name.clone();
680 entries.push((name, vec![XmlValue::Element(e)]));
681 }
682 }
683 XmlValue::Text(t) => {
684 if let Some(entry) = entries.iter_mut().find(|(k, _)| k == "$value") {
685 entry.1.push(XmlValue::Text(t.clone()));
686 }
687 else {
688 entries.push(("$value".to_string(), vec![XmlValue::Text(t.clone())]));
689 }
690 }
691 _ => {}
692 }
693 }
694
695 let final_entries = entries
696 .into_iter()
697 .map(|(k, mut v)| {
698 let val = if k == "$value" {
699 if v.len() == 1 { v.remove(0) } else { XmlValue::Fragment(v) }
700 }
701 else if v.len() == 1 {
702 v.remove(0)
703 }
704 else {
705 XmlValue::Fragment(v)
706 };
707 println!("MapEntry: key={}, value={:?}", k, val);
708 (k, val)
709 })
710 .collect::<Vec<_>>();
711
712 Self { entries: final_entries.into_iter(), current_value: None }
713 }
714}
715
716impl<'de> de::MapAccess<'de> for MapDeserializer {
717 type Error = Error;
718
719 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
720 where
721 K: de::DeserializeSeed<'de>,
722 {
723 if let Some((key, value)) = self.entries.next() {
724 self.current_value = Some(value);
725 return seed.deserialize(de::value::StrDeserializer::<Error>::new(&key)).map(Some);
726 }
727
728 Ok(None)
729 }
730
731 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
732 where
733 V: de::DeserializeSeed<'de>,
734 {
735 match self.current_value.take() {
736 Some(value) => seed.deserialize(value),
737 None => Err(de::Error::custom("next_value_seed called before next_key_seed")),
738 }
739 }
740}
741
742struct SeqDeserializer {
743 iter: std::vec::IntoIter<XmlValue>,
744}
745
746impl SeqDeserializer {
747 fn new(elements: Vec<XmlValue>) -> Self {
748 Self { iter: elements.into_iter() }
749 }
750}
751
752impl<'de> de::SeqAccess<'de> for SeqDeserializer {
753 type Error = Error;
754
755 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
756 where
757 T: de::DeserializeSeed<'de>,
758 {
759 match self.iter.next() {
760 Some(value) => seed.deserialize(value).map(Some),
761 None => Ok(None),
762 }
763 }
764}
765
766struct EnumDeserializer {
767 variant: String,
768 value: Option<XmlValue>,
769}
770
771impl EnumDeserializer {
772 fn new(variant: String, value: Option<XmlValue>) -> Self {
773 Self { variant, value }
774 }
775}
776
777impl<'de> de::EnumAccess<'de> for EnumDeserializer {
778 type Error = Error;
779 type Variant = VariantDeserializer;
780
781 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
782 where
783 V: de::DeserializeSeed<'de>,
784 {
785 let variant = seed.deserialize(de::value::StrDeserializer::<Error>::new(&self.variant))?;
786 Ok((variant, VariantDeserializer { value: self.value }))
787 }
788}
789
790struct VariantDeserializer {
791 value: Option<XmlValue>,
792}
793
794impl<'de> de::VariantAccess<'de> for VariantDeserializer {
795 type Error = Error;
796
797 fn unit_variant(self) -> Result<(), Self::Error> {
798 Ok(())
799 }
800
801 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
802 where
803 T: de::DeserializeSeed<'de>,
804 {
805 match self.value {
806 Some(value) => seed.deserialize(value),
807 None => Err(de::Error::custom("Expected newtype variant")),
808 }
809 }
810
811 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
812 where
813 V: Visitor<'de>,
814 {
815 match self.value {
816 Some(XmlValue::Element(e)) => visitor.visit_seq(SeqDeserializer::new(e.children)),
817 _ => Err(de::Error::custom("Expected element for tuple variant")),
818 }
819 }
820
821 fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value, Self::Error>
822 where
823 V: Visitor<'de>,
824 {
825 match self.value {
826 Some(XmlValue::Element(e)) => visitor.visit_map(MapDeserializer::new(e)),
827 _ => Err(de::Error::custom("Expected element for struct variant")),
828 }
829 }
830}