@@ -8,17 +8,36 @@ use core::marker::PhantomData;
8
8
use super :: * ;
9
9
10
10
impl < ' de > Deserialize < ' de > for XmlValue {
11
+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
12
+ where
13
+ D : Deserializer < ' de > ,
14
+ {
15
+ XmlValueWithoutSeq :: deserialize ( deserializer) . map ( From :: from)
16
+ }
17
+
18
+ fn deserialize_seq < D : Deserializer < ' de > > ( deserializer : D ) -> Result < Self , D :: Error > {
19
+ deserializer
20
+ . deserialize_seq ( IteratorVisitor :: < _ , XmlSeq < XmlValueWithoutSeq > > :: default ( ) )
21
+ . map ( |mut a| match a. values . len ( ) {
22
+ 0 => XmlValue :: None ,
23
+ 1 => a. values . pop_front ( ) . expect ( "Just checked." ) . into ( ) ,
24
+ _ => XmlValue :: Seq ( a. values . into_iter ( ) . map ( From :: from) . collect ( ) ) ,
25
+ } )
26
+ }
27
+ }
28
+
29
+ impl < ' de > Deserialize < ' de > for XmlValueWithoutSeq {
11
30
fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
12
31
where
13
32
D : Deserializer < ' de > ,
14
33
{
15
34
struct __Visitor < ' v > {
16
- marker : PhantomData < XmlValue > ,
35
+ marker : PhantomData < XmlValueWithoutSeq > ,
17
36
lifetime : PhantomData < & ' v ( ) > ,
18
37
}
19
38
20
39
impl < ' v > crate :: de:: Visitor < ' v > for __Visitor < ' v > {
21
- type Value = XmlValue ;
40
+ type Value = XmlValueWithoutSeq ;
22
41
23
42
fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
24
43
formatter. write_str ( "a comment" )
@@ -29,7 +48,9 @@ impl<'de> Deserialize<'de> for XmlValue {
29
48
E : de:: Error ,
30
49
V : de:: XmlText < ' v > ,
31
50
{
32
- XmlTextVisitor :: new ( ) . visit_text ( value) . map ( XmlValue :: Text )
51
+ XmlTextVisitor :: new ( )
52
+ . visit_text ( value)
53
+ . map ( XmlValueWithoutSeq :: Text )
33
54
}
34
55
35
56
fn visit_cdata < E , V > ( self , value : V ) -> Result < Self :: Value , E >
@@ -39,7 +60,7 @@ impl<'de> Deserialize<'de> for XmlValue {
39
60
{
40
61
XmlCDataVisitor :: new ( )
41
62
. visit_cdata ( value)
42
- . map ( XmlValue :: CData )
63
+ . map ( XmlValueWithoutSeq :: CData )
43
64
}
44
65
45
66
fn visit_element < A > ( self , element : A ) -> Result < Self :: Value , A :: Error >
@@ -48,16 +69,7 @@ impl<'de> Deserialize<'de> for XmlValue {
48
69
{
49
70
XmlElementVisitor :: new ( )
50
71
. visit_element ( element)
51
- . map ( XmlValue :: Element )
52
- }
53
-
54
- fn visit_seq < S > ( self , sequence : S ) -> Result < Self :: Value , S :: Error >
55
- where
56
- S : de:: SeqAccess < ' v > ,
57
- {
58
- IteratorVisitor :: < _ , XmlSeq < XmlValue > > :: default ( )
59
- . visit_seq ( sequence)
60
- . map ( XmlValue :: Seq )
72
+ . map ( XmlValueWithoutSeq :: Element )
61
73
}
62
74
63
75
fn visit_pi < E , V > ( self , value : V ) -> Result < Self :: Value , E >
@@ -67,7 +79,7 @@ impl<'de> Deserialize<'de> for XmlValue {
67
79
{
68
80
XmlProcessingInstructionVisitor :: new ( )
69
81
. visit_pi ( value)
70
- . map ( XmlValue :: PI )
82
+ . map ( XmlValueWithoutSeq :: PI )
71
83
}
72
84
73
85
fn visit_decl < E , V > ( self , declaration : V ) -> Result < Self :: Value , E >
@@ -77,7 +89,7 @@ impl<'de> Deserialize<'de> for XmlValue {
77
89
{
78
90
XmlDeclVisitor :: new ( )
79
91
. visit_decl ( declaration)
80
- . map ( XmlValue :: Decl )
92
+ . map ( XmlValueWithoutSeq :: Decl )
81
93
}
82
94
83
95
fn visit_comment < E , V > ( self , comment : V ) -> Result < Self :: Value , E >
@@ -87,7 +99,7 @@ impl<'de> Deserialize<'de> for XmlValue {
87
99
{
88
100
XmlCommentVisitor :: new ( )
89
101
. visit_comment ( comment)
90
- . map ( XmlValue :: Comment )
102
+ . map ( XmlValueWithoutSeq :: Comment )
91
103
}
92
104
93
105
fn visit_doctype < E , V > ( self , value : V ) -> Result < Self :: Value , E >
@@ -97,14 +109,14 @@ impl<'de> Deserialize<'de> for XmlValue {
97
109
{
98
110
XmlDoctypeVisitor :: new ( )
99
111
. visit_doctype ( value)
100
- . map ( XmlValue :: Doctype )
112
+ . map ( XmlValueWithoutSeq :: Doctype )
101
113
}
102
114
103
115
fn visit_none < E > ( self ) -> Result < Self :: Value , E >
104
116
where
105
117
E : de:: Error ,
106
118
{
107
- Ok ( XmlValue :: None )
119
+ Ok ( XmlValueWithoutSeq :: None )
108
120
}
109
121
}
110
122
0 commit comments