@@ -3,50 +3,45 @@ use super::{
3
3
EventFormatSerializerV03 , EventFormatSerializerV10 ,
4
4
} ;
5
5
use crate :: event:: { AttributesReader , ExtensionValue } ;
6
- use serde:: de:: { Error , IntoDeserializer , Unexpected } ;
6
+ use serde:: de:: { Error , IntoDeserializer } ;
7
7
use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
8
- use serde_value :: Value ;
9
- use std:: collections:: { BTreeMap , HashMap } ;
8
+ use serde_json :: { Map , Value } ;
9
+ use std:: collections:: HashMap ;
10
10
11
- macro_rules! parse_optional_field {
12
- ( $map: ident, $name: literal, $value_variant: ident, $error: ty) => {
11
+ macro_rules! parse_field {
12
+ ( $value: expr, $target_type: ty, $error: ty) => {
13
+ <$target_type>:: deserialize( $value. into_deserializer( ) ) . map_err( <$error>:: custom)
14
+ } ;
15
+
16
+ ( $value: expr, $target_type: ty, $error: ty, $mapper: expr) => {
17
+ <$target_type>:: deserialize( $value. into_deserializer( ) )
18
+ . map_err( <$error>:: custom)
19
+ . and_then( |v| $mapper( v) . map_err( <$error>:: custom) )
20
+ } ;
21
+ }
22
+
23
+ macro_rules! extract_optional_field {
24
+ ( $map: ident, $name: literal, $target_type: ty, $error: ty) => {
13
25
$map. remove( $name)
14
- . map( |val| match val {
15
- Value :: $value_variant( v) => Ok ( v) ,
16
- other => Err ( <$error>:: invalid_type(
17
- crate :: event:: format:: value_to_unexpected( & other) ,
18
- & stringify!( $value_variant) ,
19
- ) ) ,
20
- } )
26
+ . map( |v| parse_field!( v, $target_type, $error) )
21
27
. transpose( )
22
28
} ;
23
29
24
- ( $map: ident, $name: literal, $value_variant : ident , $error: ty, $mapper: expr) => {
30
+ ( $map: ident, $name: literal, $target_type : ty , $error: ty, $mapper: expr) => {
25
31
$map. remove( $name)
26
- . map( |val| match val {
27
- Value :: $value_variant( v) => $mapper( & v) . map_err( |e| {
28
- <$error>:: invalid_value(
29
- crate :: event:: format:: value_to_unexpected( & Value :: $value_variant( v) ) ,
30
- & e. to_string( ) . as_str( ) ,
31
- )
32
- } ) ,
33
- other => Err ( <$error>:: invalid_type(
34
- crate :: event:: format:: value_to_unexpected( & other) ,
35
- & stringify!( $value_variant) ,
36
- ) ) ,
37
- } )
32
+ . map( |v| parse_field!( v, $target_type, $error, $mapper) )
38
33
. transpose( )
39
34
} ;
40
35
}
41
36
42
- macro_rules! parse_field {
43
- ( $map: ident, $name: literal, $value_variant : ident , $error: ty) => {
44
- parse_optional_field !( $map, $name, $value_variant , $error) ?
37
+ macro_rules! extract_field {
38
+ ( $map: ident, $name: literal, $target_type : ty , $error: ty) => {
39
+ extract_optional_field !( $map, $name, $target_type , $error) ?
45
40
. ok_or_else( || <$error>:: missing_field( $name) )
46
41
} ;
47
42
48
- ( $map: ident, $name: literal, $value_variant : ident , $error: ty, $mapper: expr) => {
49
- parse_optional_field !( $map, $name, $value_variant , $error, $mapper) ?
43
+ ( $map: ident, $name: literal, $target_type : ty , $error: ty, $mapper: expr) => {
44
+ extract_optional_field !( $map, $name, $target_type , $error, $mapper) ?
50
45
. ok_or_else( || <$error>:: missing_field( $name) )
51
46
} ;
52
47
}
@@ -59,13 +54,7 @@ macro_rules! parse_data_json {
59
54
60
55
macro_rules! parse_data_string {
61
56
( $in: ident, $error: ty) => {
62
- match $in {
63
- Value :: String ( s) => Ok ( s) ,
64
- other => Err ( E :: invalid_type(
65
- crate :: event:: format:: value_to_unexpected( & other) ,
66
- & "a string" ,
67
- ) ) ,
68
- }
57
+ parse_field!( $in, String , $error)
69
58
} ;
70
59
}
71
60
@@ -78,41 +67,39 @@ macro_rules! parse_json_data_base64 {
78
67
79
68
macro_rules! parse_data_base64 {
80
69
( $in: ident, $error: ty) => {
81
- match $in {
82
- Value :: String ( s ) => base64:: decode( & s) . map_err( |e| {
70
+ parse_field! ( $in, String , $error ) . and_then ( |s| {
71
+ base64:: decode( & s) . map_err( |e| {
83
72
<$error>:: invalid_value( serde:: de:: Unexpected :: Str ( & s) , & e. to_string( ) . as_str( ) )
84
- } ) ,
85
- other => Err ( E :: invalid_type(
86
- crate :: event:: format:: value_to_unexpected( & other) ,
87
- & "a string" ,
88
- ) ) ,
89
- }
73
+ } )
74
+ } )
90
75
} ;
91
76
}
92
77
93
78
pub ( crate ) trait EventFormatDeserializer {
94
79
fn deserialize_attributes < E : serde:: de:: Error > (
95
- map : & mut BTreeMap < String , Value > ,
80
+ map : & mut Map < String , Value > ,
96
81
) -> Result < Attributes , E > ;
97
82
98
83
fn deserialize_data < E : serde:: de:: Error > (
99
84
content_type : & str ,
100
- map : & mut BTreeMap < String , Value > ,
85
+ map : & mut Map < String , Value > ,
101
86
) -> Result < Option < Data > , E > ;
102
87
103
- fn deserialize_event < E : serde:: de:: Error > (
104
- mut map : BTreeMap < String , Value > ,
105
- ) -> Result < Event , E > {
88
+ fn deserialize_event < E : serde:: de:: Error > ( mut map : Map < String , Value > ) -> Result < Event , E > {
106
89
let attributes = Self :: deserialize_attributes ( & mut map) ?;
107
90
let data = Self :: deserialize_data (
108
91
attributes. datacontenttype ( ) . unwrap_or ( "application/json" ) ,
109
92
& mut map,
110
93
) ?;
111
94
let extensions = map
112
95
. into_iter ( )
113
- . map ( |( k, v) | Ok ( ( k, ExtensionValue :: deserialize ( v. into_deserializer ( ) ) ?) ) )
114
- . collect :: < Result < HashMap < String , ExtensionValue > , serde_value:: DeserializerError > > ( )
115
- . map_err ( E :: custom) ?;
96
+ . map ( |( k, v) | {
97
+ Ok ( (
98
+ k,
99
+ ExtensionValue :: deserialize ( v. into_deserializer ( ) ) . map_err ( E :: custom) ?,
100
+ ) )
101
+ } )
102
+ . collect :: < Result < HashMap < String , ExtensionValue > , E > > ( ) ?;
116
103
117
104
Ok ( Event {
118
105
attributes,
@@ -136,20 +123,12 @@ impl<'de> Deserialize<'de> for Event {
136
123
where
137
124
D : Deserializer < ' de > ,
138
125
{
139
- let map = match Value :: deserialize ( deserializer) ? {
140
- Value :: Map ( m) => Ok ( m) ,
141
- v => Err ( Error :: invalid_type ( value_to_unexpected ( & v) , & "a map" ) ) ,
142
- } ?;
126
+ let root_value = Value :: deserialize ( deserializer) ?;
127
+ let mut map: Map < String , Value > =
128
+ Map :: deserialize ( root_value. into_deserializer ( ) ) . map_err ( D :: Error :: custom) ?;
143
129
144
- let mut map: BTreeMap < String , Value > = map
145
- . into_iter ( )
146
- . map ( |( k, v) | match k {
147
- Value :: String ( s) => Ok ( ( s, v) ) ,
148
- k => Err ( Error :: invalid_type ( value_to_unexpected ( & k) , & "a string" ) ) ,
149
- } )
150
- . collect :: < Result < BTreeMap < String , Value > , <D as Deserializer < ' de > >:: Error > > ( ) ?;
151
-
152
- match parse_field ! ( map, "specversion" , String , <D as Deserializer <' de>>:: Error ) ?. as_str ( ) {
130
+ match extract_field ! ( map, "specversion" , String , <D as Deserializer <' de>>:: Error ) ?. as_str ( )
131
+ {
153
132
"0.3" => EventFormatDeserializerV03 :: deserialize_event ( map) ,
154
133
"1.0" => EventFormatDeserializerV10 :: deserialize_event ( map) ,
155
134
s => Err ( D :: Error :: unknown_variant (
@@ -175,28 +154,3 @@ impl Serialize for Event {
175
154
}
176
155
}
177
156
}
178
-
179
- // This should be provided by the Value package itself
180
- pub ( crate ) fn value_to_unexpected ( v : & Value ) -> Unexpected {
181
- match v {
182
- Value :: Bool ( b) => serde:: de:: Unexpected :: Bool ( * b) ,
183
- Value :: U8 ( n) => serde:: de:: Unexpected :: Unsigned ( * n as u64 ) ,
184
- Value :: U16 ( n) => serde:: de:: Unexpected :: Unsigned ( * n as u64 ) ,
185
- Value :: U32 ( n) => serde:: de:: Unexpected :: Unsigned ( * n as u64 ) ,
186
- Value :: U64 ( n) => serde:: de:: Unexpected :: Unsigned ( * n) ,
187
- Value :: I8 ( n) => serde:: de:: Unexpected :: Signed ( * n as i64 ) ,
188
- Value :: I16 ( n) => serde:: de:: Unexpected :: Signed ( * n as i64 ) ,
189
- Value :: I32 ( n) => serde:: de:: Unexpected :: Signed ( * n as i64 ) ,
190
- Value :: I64 ( n) => serde:: de:: Unexpected :: Signed ( * n) ,
191
- Value :: F32 ( n) => serde:: de:: Unexpected :: Float ( * n as f64 ) ,
192
- Value :: F64 ( n) => serde:: de:: Unexpected :: Float ( * n) ,
193
- Value :: Char ( c) => serde:: de:: Unexpected :: Char ( * c) ,
194
- Value :: String ( s) => serde:: de:: Unexpected :: Str ( s) ,
195
- Value :: Unit => serde:: de:: Unexpected :: Unit ,
196
- Value :: Option ( _) => serde:: de:: Unexpected :: Option ,
197
- Value :: Newtype ( _) => serde:: de:: Unexpected :: NewtypeStruct ,
198
- Value :: Seq ( _) => serde:: de:: Unexpected :: Seq ,
199
- Value :: Map ( _) => serde:: de:: Unexpected :: Map ,
200
- Value :: Bytes ( b) => serde:: de:: Unexpected :: Bytes ( b) ,
201
- }
202
- }
0 commit comments