Skip to content

Commit a70a46d

Browse files
committed
try deserializer for value + fmt
1 parent 3542b38 commit a70a46d

File tree

1 file changed

+43
-12
lines changed

1 file changed

+43
-12
lines changed

crates/amf0/src/value.rs

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -285,25 +285,56 @@ impl serde::ser::Serialize for Amf0Value<'_> {
285285
impl<'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

309340
struct 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

Comments
 (0)