1use crate::{
2 de::{self, NamespaceContext, SeqAccess, Visitor},
3 Deserialize, Deserializer, ExpandedName, Prefix, XmlNamespace,
4};
5use core::marker::PhantomData;
6
7use super::*;
8
9impl<'de> Deserialize<'de> for XmlValue {
10 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
11 where
12 D: Deserializer<'de>,
13 {
14 struct __Visitor<'v> {
15 marker: PhantomData<XmlValue>,
16 lifetime: PhantomData<&'v ()>,
17 }
18
19 impl<'v> crate::de::Visitor<'v> for __Visitor<'v> {
20 type Value = XmlValue;
21
22 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
23 formatter.write_str("a comment")
24 }
25
26 fn visit_text<E, V>(self, value: V) -> Result<Self::Value, E>
27 where
28 E: de::Error,
29 V: de::XmlText<'v>,
30 {
31 XmlTextVisitor::new().visit_text(value).map(XmlValue::Text)
32 }
33
34 fn visit_cdata<E, V>(self, value: V) -> Result<Self::Value, E>
35 where
36 E: de::Error,
37 V: de::XmlCData<'v>,
38 {
39 XmlCDataVisitor::new()
40 .visit_cdata(value)
41 .map(XmlValue::CData)
42 }
43
44 fn visit_element<A>(self, element: A) -> Result<Self::Value, A::Error>
45 where
46 A: de::ElementAccess<'v>,
47 {
48 XmlElementVisitor::new()
49 .visit_element(element)
50 .map(XmlValue::Element)
51 }
52
53 fn visit_seq<S>(self, sequence: S) -> Result<Self::Value, S::Error>
54 where
55 S: de::SeqAccess<'v>,
56 {
57 IteratorVisitor::<_, XmlSeq<XmlValue>>::default()
58 .visit_seq(sequence)
59 .map(XmlValue::Seq)
60 }
61
62 fn visit_pi<E, V>(self, value: V) -> Result<Self::Value, E>
63 where
64 E: de::Error,
65 V: de::XmlProcessingInstruction,
66 {
67 XmlProcessingInstructionVisitor::new()
68 .visit_pi(value)
69 .map(XmlValue::PI)
70 }
71
72 fn visit_decl<E, V>(self, declaration: V) -> Result<Self::Value, E>
73 where
74 E: de::Error,
75 V: de::XmlDeclaration,
76 {
77 XmlDeclVisitor::new()
78 .visit_decl(declaration)
79 .map(XmlValue::Decl)
80 }
81
82 fn visit_comment<E, V>(self, comment: V) -> Result<Self::Value, E>
83 where
84 E: de::Error,
85 V: de::XmlComment<'v>,
86 {
87 XmlCommentVisitor::new()
88 .visit_comment(comment)
89 .map(XmlValue::Comment)
90 }
91
92 fn visit_doctype<E, V>(self, value: V) -> Result<Self::Value, E>
93 where
94 E: de::Error,
95 V: de::XmlDoctype<'v>,
96 {
97 XmlDoctypeVisitor::new()
98 .visit_doctype(value)
99 .map(XmlValue::Doctype)
100 }
101
102 fn visit_none<E>(self) -> Result<Self::Value, E>
103 where
104 E: de::Error,
105 {
106 Ok(XmlValue::None)
107 }
108 }
109
110 deserializer.deserialize_any(__Visitor {
111 lifetime: PhantomData,
112 marker: PhantomData,
113 })
114 }
115}
116
117struct XmlTextVisitor<'v> {
120 marker: PhantomData<XmlText>,
121 lifetime: PhantomData<&'v ()>,
122}
123
124impl XmlTextVisitor<'_> {
125 fn new() -> Self {
126 Self {
127 marker: PhantomData,
128 lifetime: PhantomData,
129 }
130 }
131}
132
133impl<'v> crate::de::Visitor<'v> for XmlTextVisitor<'v> {
134 type Value = XmlText;
135
136 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
137 formatter.write_str("a comment")
138 }
139
140 fn visit_text<E, V>(self, value: V) -> Result<Self::Value, E>
141 where
142 E: de::Error,
143 V: de::XmlText<'v>,
144 {
145 Ok(XmlText(value.into_bytes().into()))
146 }
147}
148
149impl NamespaceContext for () {
150 fn resolve_prefix(&self, _prefix: Prefix<'_>) -> Option<XmlNamespace<'_>> {
151 None
152 }
153}
154
155impl<'de> Deserialize<'de> for XmlText {
156 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
157 where
158 D: Deserializer<'de>,
159 {
160 deserializer.deserialize_any(XmlTextVisitor::new())
161 }
162}
163
164struct XmlCDataVisitor<'v> {
167 marker: PhantomData<XmlCData>,
168 lifetime: PhantomData<&'v ()>,
169}
170impl XmlCDataVisitor<'_> {
171 fn new() -> Self {
172 Self {
173 marker: PhantomData,
174 lifetime: PhantomData,
175 }
176 }
177}
178
179impl<'de> Visitor<'de> for XmlCDataVisitor<'de> {
180 type Value = XmlCData;
181 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
182 formatter.write_str("a CDATA section")
183 }
184 fn visit_cdata<E, V>(self, value: V) -> Result<Self::Value, E>
185 where
186 E: de::Error,
187 V: de::XmlCData<'de>,
188 {
189 Ok(XmlCData(value.as_bytes().to_owned()))
190 }
191}
192
193impl<'de> Deserialize<'de> for XmlCData {
194 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
195 where
196 D: Deserializer<'de>,
197 {
198 deserializer.deserialize_any(XmlCDataVisitor::new())
199 }
200}
201
202struct XmlChildVisitor<'v> {
205 marker: PhantomData<XmlChild>,
206 lifetime: PhantomData<&'v ()>,
207}
208impl XmlChildVisitor<'_> {
209 fn new() -> Self {
210 Self {
211 marker: PhantomData,
212 lifetime: PhantomData,
213 }
214 }
215}
216
217impl<'v> crate::de::Visitor<'v> for XmlChildVisitor<'v> {
218 type Value = XmlChild;
219 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
220 formatter.write_str("an XML child")
221 }
222
223 fn visit_text<E, V>(self, value: V) -> Result<Self::Value, E>
224 where
225 E: de::Error,
226 V: de::XmlText<'v>,
227 {
228 XmlTextVisitor::new().visit_text(value).map(XmlChild::Text)
229 }
230
231 fn visit_cdata<E, V>(self, value: V) -> Result<Self::Value, E>
232 where
233 E: de::Error,
234 V: de::XmlCData<'v>,
235 {
236 XmlCDataVisitor::new()
237 .visit_cdata(value)
238 .map(XmlChild::CData)
239 }
240
241 fn visit_element<A>(self, element: A) -> Result<Self::Value, A::Error>
242 where
243 A: de::ElementAccess<'v>,
244 {
245 XmlElementVisitor::new()
246 .visit_element(element)
247 .map(XmlChild::Element)
248 }
249
250 fn visit_pi<E, V>(self, value: V) -> Result<Self::Value, E>
251 where
252 E: de::Error,
253 V: de::XmlProcessingInstruction,
254 {
255 XmlProcessingInstructionVisitor::new()
256 .visit_pi(value)
257 .map(XmlChild::PI)
258 }
259
260 fn visit_comment<E, V>(self, value: V) -> Result<Self::Value, E>
261 where
262 E: de::Error,
263 V: de::XmlComment<'v>,
264 {
265 XmlCommentVisitor::new()
266 .visit_comment(value)
267 .map(XmlChild::Comment)
268 }
269}
270
271impl<'de> de::Deserialize<'de> for XmlChild {
272 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
273 where
274 D: de::Deserializer<'de>,
275 {
276 deserializer.deserialize_any(XmlChildVisitor::new())
277 }
278}
279
280struct XmlElementVisitor<'v> {
283 marker: PhantomData<XmlElement>,
284 lifetime: PhantomData<&'v ()>,
285}
286impl XmlElementVisitor<'_> {
287 fn new() -> Self {
288 Self {
289 marker: PhantomData,
290 lifetime: PhantomData,
291 }
292 }
293}
294
295impl<'v> crate::de::Visitor<'v> for XmlElementVisitor<'v> {
296 type Value = XmlElement;
297 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
298 formatter.write_str("an element")
299 }
300
301 fn visit_element<A>(self, mut element: A) -> Result<Self::Value, A::Error>
302 where
303 A: de::ElementAccess<'v>,
304 {
305 let name = element.name().clone().into_owned();
306 let attributes = iter::from_fn(|| match element.next_attribute::<XmlAttribute>() {
307 Ok(Some(attr)) => Some(Ok(attr)),
308 Ok(None) => None,
309 Err(err) => Some(Err(err)),
310 })
311 .collect::<Result<_, _>>()?;
312 let mut children = element.children()?;
313
314 let children = iter::from_fn(|| match children.next_element::<XmlChild>() {
315 Ok(Some(child)) => Some(Ok(child)),
316 Ok(None) => None,
317 Err(err) => Some(Err(err)),
318 })
319 .collect::<Result<_, _>>()?;
320
321 Ok(XmlElement {
322 name,
323 attributes,
324 children,
325 preferred_prefix: None,
326 enforce_prefix: crate::ser::IncludePrefix::Never,
327 })
328 }
329}
330
331impl<'de> crate::de::Deserialize<'de> for XmlElement {
332 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
333 where
334 D: crate::de::Deserializer<'de>,
335 {
336 deserializer.deserialize_any(XmlElementVisitor::new())
337 }
338}
339
340struct XmlAttributeVisitor<'v> {
343 marker: PhantomData<XmlAttribute>,
344 lifetime: PhantomData<&'v ()>,
345}
346
347impl XmlAttributeVisitor<'_> {
348 fn new() -> Self {
349 Self {
350 marker: PhantomData,
351 lifetime: PhantomData,
352 }
353 }
354}
355
356impl<'v> crate::de::Visitor<'v> for XmlAttributeVisitor<'v> {
357 type Value = XmlAttribute;
358 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
359 formatter.write_str("an attribute")
360 }
361
362 fn visit_attribute<A>(self, attribute: A) -> Result<Self::Value, A::Error>
363 where
364 A: de::AttributeAccess<'v>,
365 {
366 Ok(XmlAttribute {
367 name: attribute.name().clone().into_owned(),
368 value: attribute.value()?,
369 })
370 }
371}
372
373impl<'a> de::AttributeAccess<'a> for &'a XmlAttribute {
374 type Error = XmlValueDeserializerError;
375
376 fn name(&self) -> ExpandedName<'_> {
377 self.name.clone()
378 }
379
380 fn value<T>(self) -> Result<T, Self::Error>
381 where
382 T: Deserialize<'a>,
383 {
384 T::deserialize(&self.value)
385 }
386}
387
388impl<'de> crate::de::Deserialize<'de> for XmlAttribute {
389 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
390 where
391 D: crate::de::Deserializer<'de>,
392 {
393 deserializer.deserialize_any(XmlAttributeVisitor::new())
394 }
395}
396
397impl<'de, T: Deserialize<'de>> Deserialize<'de> for XmlSeq<T> {
400 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
401 where
402 D: crate::de::Deserializer<'de>,
403 {
404 deserializer.deserialize_seq(IteratorVisitor::<_, Self>::default())
405 }
406}
407
408struct XmlProcessingInstructionVisitor<'v> {
411 marker: PhantomData<XmlProcessingInstruction>,
412 lifetime: PhantomData<&'v ()>,
413}
414
415impl XmlProcessingInstructionVisitor<'_> {
416 fn new() -> Self {
417 Self {
418 marker: PhantomData,
419 lifetime: PhantomData,
420 }
421 }
422}
423
424impl<'v> crate::de::Visitor<'v> for XmlProcessingInstructionVisitor<'v> {
425 type Value = XmlProcessingInstruction;
426
427 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
428 formatter.write_str("a comment")
429 }
430
431 fn visit_pi<E, V>(self, value: V) -> Result<Self::Value, E>
432 where
433 E: de::Error,
434 V: de::XmlProcessingInstruction,
435 {
436 Ok(XmlProcessingInstruction {
437 target: value.target().to_vec(),
438 content: value.content().to_vec(),
439 })
440 }
441}
442
443impl<'de> Deserialize<'de> for XmlProcessingInstruction {
444 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
445 where
446 D: Deserializer<'de>,
447 {
448 deserializer.deserialize_any(XmlProcessingInstructionVisitor::new())
449 }
450}
451
452struct XmlDeclVisitor<'v> {
455 marker: PhantomData<XmlDecl>,
456 lifetime: PhantomData<&'v ()>,
457}
458
459impl XmlDeclVisitor<'_> {
460 fn new() -> Self {
461 Self {
462 marker: PhantomData,
463 lifetime: PhantomData,
464 }
465 }
466}
467
468impl<'v> crate::de::Visitor<'v> for XmlDeclVisitor<'v> {
469 type Value = XmlDecl;
470 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
471 formatter.write_str("a declaration")
472 }
473
474 fn visit_decl<E, V>(self, declaration: V) -> Result<Self::Value, E>
475 where
476 E: de::Error,
477 V: de::XmlDeclaration,
478 {
479 Ok(XmlDecl {
480 version: String::from_utf8_lossy(declaration.version()).to_string(),
481 encoding: declaration
482 .encoding()
483 .map(|e| String::from_utf8_lossy(e).to_string()),
484 standalone: declaration
485 .standalone()
486 .map(|e| String::from_utf8_lossy(e).to_string()),
487 })
488 }
489}
490
491impl<'de> Deserialize<'de> for XmlDecl {
492 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
493 where
494 D: Deserializer<'de>,
495 {
496 deserializer.deserialize_any(XmlDeclVisitor::new())
497 }
498}
499
500struct XmlCommentVisitor<'v> {
503 marker: PhantomData<XmlComment>,
504 lifetime: PhantomData<&'v ()>,
505}
506
507impl XmlCommentVisitor<'_> {
508 pub fn new() -> Self {
509 Self {
510 marker: PhantomData,
511 lifetime: PhantomData,
512 }
513 }
514}
515
516impl<'v> crate::de::Visitor<'v> for XmlCommentVisitor<'v> {
517 type Value = XmlComment;
518
519 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
520 formatter.write_str("a comment")
521 }
522
523 fn visit_comment<E, V>(self, comment: V) -> Result<Self::Value, E>
524 where
525 E: de::Error,
526 V: de::XmlComment<'v>,
527 {
528 Ok(XmlComment(comment.into_bytes().into_owned()))
529 }
530}
531
532impl<'de> Deserialize<'de> for XmlComment {
533 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
534 where
535 D: Deserializer<'de>,
536 {
537 deserializer.deserialize_any(XmlCommentVisitor::new())
538 }
539}
540
541struct XmlDoctypeVisitor<'v> {
544 marker: PhantomData<XmlDoctype>,
545 lifetime: PhantomData<&'v ()>,
546}
547
548impl XmlDoctypeVisitor<'_> {
549 pub fn new() -> Self {
550 Self {
551 marker: PhantomData,
552 lifetime: PhantomData,
553 }
554 }
555}
556
557impl<'v> crate::de::Visitor<'v> for XmlDoctypeVisitor<'v> {
558 type Value = XmlDoctype;
559
560 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
561 formatter.write_str("a comment")
562 }
563
564 fn visit_doctype<E, V>(self, value: V) -> Result<Self::Value, E>
565 where
566 E: de::Error,
567 V: de::XmlDoctype<'v>,
568 {
569 Ok(XmlDoctype(value.into_bytes().into_owned()))
570 }
571}
572
573impl<'de> Deserialize<'de> for XmlDoctype {
574 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
575 where
576 D: Deserializer<'de>,
577 {
578 deserializer.deserialize_any(XmlDoctypeVisitor::new())
579 }
580}