@@ -12,27 +12,6 @@ mod stream;
1212
1313pub use stream:: * ;
1414
15- #[ cfg( feature = "serde" ) ]
16- #[ cfg_attr( docsrs, doc( cfg( feature = "serde" ) ) ) ]
17- macro_rules! impl_de_number {
18- ( $deserializser_fn: ident, $visit_fn: ident) => {
19- fn $deserializser_fn<V >( self , visitor: V ) -> Result <V :: Value , Self :: Error >
20- where
21- V : serde:: de:: Visitor <' de>,
22- {
23- if let Some ( Amf0Marker :: Number ) = self . next_marker {
24- // must make sure the marker is a number so we don't error out
25- let value = self . decode_number( ) ?;
26- if let Some ( value) = :: num_traits:: cast( value) {
27- return visitor. $visit_fn( value) ;
28- }
29- }
30-
31- self . deserialize_any( visitor)
32- }
33- } ;
34- }
35-
3615/// Deserialize a value from a given [`bytes::Buf`].
3716pub fn from_buf < ' de , T > ( buf : impl bytes:: Buf ) -> crate :: Result < T >
3817where
@@ -63,14 +42,35 @@ where
6342 Ok ( value)
6443}
6544
45+ #[ cfg( feature = "serde" ) ]
46+ #[ cfg_attr( docsrs, doc( cfg( feature = "serde" ) ) ) ]
47+ macro_rules! impl_de_number {
48+ ( $deserializser_fn: ident, $visit_fn: ident) => {
49+ fn $deserializser_fn<V >( self , visitor: V ) -> Result <V :: Value , Self :: Error >
50+ where
51+ V : serde:: de:: Visitor <' de>,
52+ {
53+ if let Some ( Amf0Marker :: Number ) = self . next_marker {
54+ // must make sure the marker is a number so we don't error out
55+ let value = self . decode_number( ) ?;
56+ if let Some ( value) = :: num_traits:: cast( value) {
57+ return visitor. $visit_fn( value) ;
58+ }
59+ }
60+
61+ self . deserialize_any( visitor)
62+ }
63+ } ;
64+ }
65+
6666impl < ' de , R > serde:: de:: Deserializer < ' de > for & mut Amf0Decoder < R >
6767where
6868 R : ZeroCopyReader < ' de > ,
6969{
7070 type Error = Amf0Error ;
7171
7272 serde:: forward_to_deserialize_any! {
73- f64
73+ f64 ignored_any
7474 }
7575
7676 impl_de_number ! ( deserialize_i8, visit_i8) ;
@@ -112,47 +112,62 @@ where
112112 where
113113 V : serde:: de:: Visitor < ' de > ,
114114 {
115- // TODO: check everything before calling decode
116- let value = self . decode_boolean ( ) ?;
117- visitor. visit_bool ( value)
115+ if let Some ( Amf0Marker :: Boolean ) = self . next_marker {
116+ let value = self . decode_boolean ( ) ?;
117+ return visitor. visit_bool ( value) ;
118+ }
119+ self . deserialize_any ( visitor)
118120 }
119121
120- fn deserialize_char < V > ( self , _visitor : V ) -> Result < V :: Value , Self :: Error >
122+ fn deserialize_char < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
121123 where
122124 V : serde:: de:: Visitor < ' de > ,
123125 {
124- // should we still error here?
125- Err ( Amf0Error :: CharNotSupported )
126+ // should we still error here? original line below
127+ // Err(Amf0Error::CharNotSupported)
128+ self . deserialize_any ( visitor)
126129 }
127130
128131 fn deserialize_string < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
129132 where
130133 V : serde:: de:: Visitor < ' de > ,
131134 {
132- let value = self . decode_string ( ) ?;
133- value. into_deserializer ( ) . deserialize_string ( visitor)
135+ if let Some ( Amf0Marker :: String ) = self . next_marker {
136+ let value = self . decode_string ( ) ?;
137+ return value. into_deserializer ( ) . deserialize_string ( visitor) ;
138+ }
139+ self . deserialize_any ( visitor)
134140 }
135141
136142 fn deserialize_str < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
137143 where
138144 V : serde:: de:: Visitor < ' de > ,
139145 {
140- let value = self . decode_string ( ) ?;
141- value. into_deserializer ( ) . deserialize_str ( visitor)
146+ if let Some ( Amf0Marker :: String ) = self . next_marker {
147+ let value = self . decode_string ( ) ?;
148+ return value. into_deserializer ( ) . deserialize_str ( visitor) ;
149+ }
150+ self . deserialize_any ( visitor)
142151 }
143152
144153 fn deserialize_bytes < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
145154 where
146155 V : serde:: de:: Visitor < ' de > ,
147156 {
148- self . deserialize_seq ( visitor)
157+ if let Some ( Amf0Marker :: StrictArray ) = self . next_marker {
158+ return self . deserialize_seq ( visitor) ;
159+ }
160+ self . deserialize_any ( visitor)
149161 }
150162
151163 fn deserialize_byte_buf < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
152164 where
153165 V : serde:: de:: Visitor < ' de > ,
154166 {
155- self . deserialize_seq ( visitor)
167+ if let Some ( Amf0Marker :: StrictArray ) = self . next_marker {
168+ return self . deserialize_seq ( visitor) ;
169+ }
170+ self . deserialize_any ( visitor)
156171 }
157172
158173 fn deserialize_option < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
@@ -174,79 +189,97 @@ where
174189 where
175190 V : serde:: de:: Visitor < ' de > ,
176191 {
177- self . decode_null ( ) ?;
178- visitor. visit_unit ( )
192+ if let Some ( Amf0Marker :: Null | Amf0Marker :: Undefined ) = self . next_marker {
193+ self . decode_null ( ) ?;
194+ return visitor. visit_unit ( ) ;
195+ }
196+ self . deserialize_any ( visitor)
179197 }
180198
181199 fn deserialize_unit_struct < V > ( self , _name : & ' static str , visitor : V ) -> Result < V :: Value , Self :: Error >
182200 where
183201 V : serde:: de:: Visitor < ' de > ,
184202 {
185- self . deserialize_unit ( visitor)
203+ if let Some ( Amf0Marker :: Null | Amf0Marker :: Undefined ) = self . next_marker {
204+ return self . deserialize_unit ( visitor) ;
205+ }
206+ self . deserialize_any ( visitor)
186207 }
187208
188209 fn deserialize_newtype_struct < V > ( self , name : & ' static str , visitor : V ) -> Result < V :: Value , Self :: Error >
189210 where
190211 V : serde:: de:: Visitor < ' de > ,
191212 {
192- if name == stream:: MULTI_VALUE_NEW_TYPE {
193- visitor. visit_seq ( MultiValueDe { de : self } )
194- } else {
195- visitor. visit_newtype_struct ( self )
213+ match ( self . next_marker , name) {
214+ ( Some ( Amf0Marker :: StrictArray ) , stream:: MULTI_VALUE_NEW_TYPE ) => visitor. visit_seq ( MultiValueDe { de : self } ) ,
215+ _ => visitor. visit_newtype_struct ( self ) ,
196216 }
197217 }
198218
199219 fn deserialize_seq < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
200220 where
201221 V : serde:: de:: Visitor < ' de > ,
202222 {
203- let size = self . decode_strict_array_header ( ) ? as usize ;
223+ if let Some ( Amf0Marker :: StrictArray ) = self . next_marker {
224+ let size = self . decode_strict_array_header ( ) ? as usize ;
204225
205- visitor. visit_seq ( StrictArray {
206- de : self ,
207- remaining : size,
208- } )
226+ return visitor. visit_seq ( StrictArray {
227+ de : self ,
228+ remaining : size,
229+ } ) ;
230+ }
231+ self . deserialize_any ( visitor)
209232 }
210233
211- fn deserialize_tuple < V > ( self , len : usize , visitor : V ) -> Result < V :: Value , Self :: Error >
234+ fn deserialize_tuple < V > ( self , _len : usize , visitor : V ) -> Result < V :: Value , Self :: Error >
212235 where
213236 V : serde:: de:: Visitor < ' de > ,
214237 {
215- let size = self . decode_strict_array_header ( ) ? as usize ;
216-
217- if len != size {
218- return Err ( Amf0Error :: WrongArrayLength {
219- expected : len,
220- got : size,
238+ if let Some ( Amf0Marker :: StrictArray ) = self . next_marker {
239+ let size = self . decode_strict_array_header ( ) ? as usize ;
240+
241+ // there used to be this check, but we shouldn't error from deserializing...
242+ // if len != size {
243+ // return Err(Amf0Error::WrongArrayLength {
244+ // expected: len,
245+ // got: size,
246+ // });
247+ // }
248+
249+ return visitor. visit_seq ( StrictArray {
250+ de : self ,
251+ remaining : size,
221252 } ) ;
222253 }
223-
224- visitor. visit_seq ( StrictArray {
225- de : self ,
226- remaining : size,
227- } )
254+ self . deserialize_any ( visitor)
228255 }
229256
230257 fn deserialize_tuple_struct < V > ( self , _name : & ' static str , len : usize , visitor : V ) -> Result < V :: Value , Self :: Error >
231258 where
232259 V : serde:: de:: Visitor < ' de > ,
233260 {
234- self . deserialize_tuple ( len, visitor)
261+ if let Some ( Amf0Marker :: StrictArray ) = self . next_marker {
262+ return self . deserialize_tuple ( len, visitor) ;
263+ }
264+ self . deserialize_any ( visitor)
235265 }
236266
237267 fn deserialize_map < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
238268 where
239269 V : serde:: de:: Visitor < ' de > ,
240270 {
241- let header = self . decode_object_header ( ) ?;
242-
243- match header {
244- ObjectHeader :: Object | ObjectHeader :: TypedObject { .. } => visitor. visit_map ( Object { de : self } ) ,
245- ObjectHeader :: EcmaArray { size } => visitor. visit_map ( EcmaArray {
246- de : self ,
247- remaining : size as usize ,
248- } ) ,
271+ if let Some ( Amf0Marker :: Object ) = self . next_marker {
272+ let header = self . decode_object_header ( ) ?;
273+
274+ return match header {
275+ ObjectHeader :: Object | ObjectHeader :: TypedObject { .. } => visitor. visit_map ( Object { de : self } ) ,
276+ ObjectHeader :: EcmaArray { size } => visitor. visit_map ( EcmaArray {
277+ de : self ,
278+ remaining : size as usize ,
279+ } ) ,
280+ } ;
249281 }
282+ self . deserialize_any ( visitor)
250283 }
251284
252285 fn deserialize_struct < V > (
@@ -258,7 +291,10 @@ where
258291 where
259292 V : serde:: de:: Visitor < ' de > ,
260293 {
261- self . deserialize_map ( visitor)
294+ if let Some ( Amf0Marker :: Object ) = self . next_marker {
295+ return self . deserialize_map ( visitor) ;
296+ }
297+ self . deserialize_any ( visitor)
262298 }
263299
264300 fn deserialize_enum < V > (
@@ -270,21 +306,18 @@ where
270306 where
271307 V : serde:: de:: Visitor < ' de > ,
272308 {
309+ // what marker would this have?
273310 visitor. visit_enum ( Enum { de : self } )
274311 }
275312
276313 fn deserialize_identifier < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
277314 where
278315 V : serde:: de:: Visitor < ' de > ,
279316 {
280- let s = self . decode_string ( ) ?;
281- s. into_deserializer ( ) . deserialize_identifier ( visitor)
282- }
283-
284- fn deserialize_ignored_any < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
285- where
286- V : serde:: de:: Visitor < ' de > ,
287- {
317+ if let Some ( Amf0Marker :: String | Amf0Marker :: LongString ) = self . next_marker {
318+ let s = self . decode_string ( ) ?;
319+ return s. into_deserializer ( ) . deserialize_identifier ( visitor) ;
320+ }
288321 self . deserialize_any ( visitor)
289322 }
290323}
0 commit comments