Skip to content

Commit 4029f6e

Browse files
fix: deserializing ints when deserializer uses different int type
1 parent ed228e1 commit 4029f6e

File tree

1 file changed

+30
-7
lines changed

1 file changed

+30
-7
lines changed

benzina/src/serde.rs

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,23 @@ use serde::{
77

88
use crate::{U15, U31, U63};
99

10+
macro_rules! impl_serde_numbers_visit {
11+
($type:ident = [$($visit_fn:ident => $kind:ident($inner:ident) => $new_fn:ident),*]) => {
12+
$(
13+
fn $visit_fn<E: de::Error>(self, v: $inner) -> Result<Self::Value, E> {
14+
v.try_into()
15+
.map_err(|_| de::Error::invalid_value(Unexpected::$kind(v.into()), &self))
16+
.and_then(|cv| {
17+
$type::$new_fn(cv)
18+
.ok_or_else(|| de::Error::invalid_value(Unexpected::$kind(v.into()), &self))
19+
})
20+
}
21+
)*
22+
}
23+
}
24+
1025
macro_rules! impl_serde_numbers {
11-
($($type:ident => $inner:ident, $deserialize_fn:ident, $visit_fn:ident),*) => {
26+
($($type:ident => $inner:ident, $deserialize_fn:ident),*) => {
1227
$(
1328
impl Serialize for $type {
1429
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
@@ -27,9 +42,17 @@ macro_rules! impl_serde_numbers {
2742
f.write_str(stringify!($type))
2843
}
2944

30-
fn $visit_fn<E: de::Error>(self, v: $inner) -> Result<Self::Value, E> {
31-
$type::new(v)
32-
.ok_or_else(|| de::Error::invalid_value(Unexpected::Unsigned(v.into()), &self))
45+
impl_serde_numbers_visit! {
46+
$type = [
47+
visit_u8 => Unsigned(u8) => new,
48+
visit_u16 => Unsigned(u16) => new,
49+
visit_u32 => Unsigned(u32) => new,
50+
visit_u64 => Unsigned(u64) => new,
51+
visit_i8 => Signed(i8) => new_signed,
52+
visit_i16 => Signed(i16) => new_signed,
53+
visit_i32 => Signed(i32) => new_signed,
54+
visit_i64 => Signed(i64) => new_signed
55+
]
3356
}
3457
}
3558

@@ -41,7 +64,7 @@ macro_rules! impl_serde_numbers {
4164
}
4265

4366
impl_serde_numbers! {
44-
U15 => u16, deserialize_u16, visit_u16,
45-
U31 => u32, deserialize_u32, visit_u32,
46-
U63 => u64, deserialize_u64, visit_u64
67+
U15 => u16, deserialize_u16,
68+
U31 => u32, deserialize_u32,
69+
U63 => u64, deserialize_u64
4770
}

0 commit comments

Comments
 (0)