File tree Expand file tree Collapse file tree 1 file changed +28
-5
lines changed Expand file tree Collapse file tree 1 file changed +28
-5
lines changed Original file line number Diff line number Diff line change @@ -126,13 +126,36 @@ impl<T: serde::Serialize> serde::Serialize for SmallVec<T> {
126
126
#[ cfg( feature = "serde" ) ]
127
127
impl < ' de , T : serde:: Deserialize < ' de > > serde:: Deserialize < ' de > for SmallVec < T > {
128
128
fn deserialize < D : serde:: Deserializer < ' de > > ( d : D ) -> Result < Self , D :: Error > {
129
- let items: Vec < T > = serde:: Deserialize :: deserialize ( d) ?;
129
+ struct SmallVecVisitor < T > {
130
+ marker : std:: marker:: PhantomData < T > ,
131
+ }
132
+
133
+ impl < ' de , T > serde:: de:: Visitor < ' de > for SmallVecVisitor < T >
134
+ where
135
+ T : serde:: Deserialize < ' de > ,
136
+ {
137
+ type Value = SmallVec < T > ;
138
+
139
+ fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
140
+ formatter. write_str ( "a sequence" )
141
+ }
130
142
131
- let mut v = Self :: empty ( ) ;
132
- for item in items {
133
- v. push ( item) ;
143
+ fn visit_seq < A > ( self , mut seq : A ) -> Result < Self :: Value , A :: Error >
144
+ where
145
+ A : serde:: de:: SeqAccess < ' de > ,
146
+ {
147
+ let mut values = SmallVec :: empty ( ) ;
148
+ while let Some ( value) = seq. next_element ( ) ? {
149
+ values. push ( value) ;
150
+ }
151
+ Ok ( values)
152
+ }
134
153
}
135
- Ok ( v)
154
+
155
+ let visitor = SmallVecVisitor {
156
+ marker : Default :: default ( ) ,
157
+ } ;
158
+ d. deserialize_seq ( visitor)
136
159
}
137
160
}
138
161
You can’t perform that action at this time.
0 commit comments