@@ -7,8 +7,23 @@ use serde::{
77
88use 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+
1025macro_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
4366impl_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