@@ -285,25 +285,56 @@ impl serde::ser::Serialize for Amf0Value<'_> {
285285impl < ' de , ' a : ' de > serde:: Deserializer < ' de > for & ' a Amf0Value < ' de > {
286286 type Error = Amf0Error ;
287287
288+ serde:: forward_to_deserialize_any! {
289+ // need to handle these number types from i8 thru f64; try to deserialze them as their original type then forward as f64
290+ bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string unit
291+ option seq bytes byte_buf map unit_struct newtype_struct tuple tuple_struct
292+ struct enum identifier ignored_any
293+ }
294+
288295 fn deserialize_any < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
289296 where
290297 V : serde:: de:: Visitor < ' de > ,
291298 {
292299 match self {
293300 Amf0Value :: Null => visitor. visit_unit ( ) ,
294301 Amf0Value :: Boolean ( b) => visitor. visit_bool ( * b) ,
295- Amf0Value :: Number ( n) => visitor. visit_f64 ( * n) ,
302+ Amf0Value :: Number ( n) => {
303+ let num = * n;
304+ if num. fract ( ) == 0.0 {
305+ let i = num as i128 ;
306+ let result = if ( i8:: MIN as i128 ) <= i && i <= ( i8:: MAX as i128 ) {
307+ visitor. visit_i8 ( i as i8 )
308+ } else if ( i16:: MIN as i128 ) <= i && i <= ( i16:: MAX as i128 ) {
309+ visitor. visit_i16 ( i as i16 )
310+ } else if ( i32:: MIN as i128 ) <= i && i <= ( i32:: MAX as i128 ) {
311+ visitor. visit_i32 ( i as i32 )
312+ } else if ( i64:: MIN as i128 ) <= i && i <= ( i64:: MAX as i128 ) {
313+ visitor. visit_i64 ( i as i64 )
314+ } else if i >= 0 && i <= ( u8:: MAX as i128 ) {
315+ visitor. visit_u8 ( i as u8 )
316+ } else if i >= 0 && i <= ( u16:: MAX as i128 ) {
317+ visitor. visit_u16 ( i as u16 )
318+ } else if i >= 0 && i <= ( u32:: MAX as i128 ) {
319+ visitor. visit_u32 ( i as u32 )
320+ } else if i >= 0 {
321+ visitor. visit_u64 ( i as u64 )
322+ } else {
323+ visitor. visit_f64 ( num)
324+ } ;
325+ result
326+ } else {
327+ visitor. visit_f64 ( num)
328+ }
329+ }
296330 Amf0Value :: String ( s) => visitor. visit_borrowed_str ( s. as_str ( ) ) ,
297331 Amf0Value :: Array ( a) => visitor. visit_seq ( Amf0SeqAccess { iter : a. iter ( ) } ) ,
298- Amf0Value :: Object ( o) => visitor. visit_map ( Amf0MapAccess { iter : o. iter ( ) , value : None } ) ,
332+ Amf0Value :: Object ( o) => visitor. visit_map ( Amf0MapAccess {
333+ iter : o. iter ( ) ,
334+ value : None ,
335+ } ) ,
299336 }
300337 }
301-
302- serde:: forward_to_deserialize_any! {
303- bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string unit
304- option seq bytes byte_buf map unit_struct newtype_struct tuple tuple_struct
305- struct enum identifier ignored_any
306- }
307338}
308339
309340struct Amf0SeqAccess < ' a , ' de > {
@@ -339,7 +370,8 @@ impl<'de, 'a: 'de> serde::de::MapAccess<'de> for Amf0MapAccess<'a, 'de> {
339370 match self . iter . next ( ) {
340371 Some ( ( key, value) ) => {
341372 self . value = Some ( value) ;
342- seed. deserialize ( serde:: de:: IntoDeserializer :: into_deserializer ( key. as_str ( ) ) ) . map ( Some )
373+ seed. deserialize ( serde:: de:: IntoDeserializer :: into_deserializer ( key. as_str ( ) ) )
374+ . map ( Some )
343375 }
344376 None => Ok ( None ) ,
345377 }
@@ -360,13 +392,12 @@ mod tests {
360392 use std:: collections:: HashMap ;
361393
362394 use scuffle_bytes_util:: StringCow ;
395+ #[ cfg( feature = "serde" ) ]
396+ use serde:: Deserialize ;
363397
364398 use super :: Amf0Value ;
365399 use crate :: { Amf0Array , Amf0Decoder , Amf0Encoder , Amf0Error , Amf0Marker , Amf0Object } ;
366400
367- #[ cfg( feature = "serde" ) ]
368- use serde:: Deserialize ;
369-
370401 #[ test]
371402 fn from ( ) {
372403 let value: Amf0Value = 1.0 . into ( ) ;
0 commit comments