4
4
//
5
5
// Copyright (c) DUSK NETWORK. All rights reserved.
6
6
7
- use alloc:: format;
8
7
use alloc:: string:: String ;
9
8
10
- use base64:: engine:: general_purpose:: STANDARD as BASE64_STANDARD ;
11
- use base64:: Engine ;
12
- use serde:: de:: { Error as SerdeError , MapAccess , Visitor } ;
13
9
use serde:: ser:: SerializeStruct ;
14
10
use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
15
11
@@ -20,26 +16,16 @@ impl Serialize for ContractId {
20
16
& self ,
21
17
serializer : S ,
22
18
) -> Result < S :: Ok , S :: Error > {
23
- let s = hex:: encode ( self . to_bytes ( ) ) ;
24
- serializer. serialize_str ( & s)
19
+ hex:: serde:: serialize ( & self . to_bytes ( ) , serializer)
25
20
}
26
21
}
27
22
28
23
impl < ' de > Deserialize < ' de > for ContractId {
29
24
fn deserialize < D : Deserializer < ' de > > (
30
25
deserializer : D ,
31
26
) -> Result < Self , D :: Error > {
32
- let s = String :: deserialize ( deserializer) ?;
33
- let decoded = hex:: decode ( & s) . map_err ( SerdeError :: custom) ?;
34
- let decoded_len = decoded. len ( ) ;
35
- let byte_length_str = format ! ( "{CONTRACT_ID_BYTES}" ) ;
36
27
let bytes: [ u8 ; CONTRACT_ID_BYTES ] =
37
- decoded. try_into ( ) . map_err ( |_| {
38
- SerdeError :: invalid_length (
39
- decoded_len,
40
- & byte_length_str. as_str ( ) ,
41
- )
42
- } ) ?;
28
+ hex:: serde:: deserialize ( deserializer) ?;
43
29
Ok ( bytes. into ( ) )
44
30
}
45
31
}
@@ -52,8 +38,7 @@ impl Serialize for Event {
52
38
let mut struct_ser = serializer. serialize_struct ( "Event" , 3 ) ?;
53
39
struct_ser. serialize_field ( "source" , & self . source ) ?;
54
40
struct_ser. serialize_field ( "topic" , & self . topic ) ?;
55
- struct_ser
56
- . serialize_field ( "data" , & BASE64_STANDARD . encode ( & self . data ) ) ?;
41
+ struct_ser. serialize_field ( "data" , & hex:: encode ( & self . data ) ) ?;
57
42
struct_ser. end ( )
58
43
}
59
44
}
@@ -62,79 +47,21 @@ impl<'de> Deserialize<'de> for Event {
62
47
fn deserialize < D : Deserializer < ' de > > (
63
48
deserializer : D ,
64
49
) -> Result < Self , D :: Error > {
65
- struct StructVisitor ;
66
-
67
- impl < ' de > Visitor < ' de > for StructVisitor {
68
- type Value = Event ;
69
-
70
- fn expecting (
71
- & self ,
72
- formatter : & mut alloc:: fmt:: Formatter ,
73
- ) -> alloc:: fmt:: Result {
74
- formatter
75
- . write_str ( "a struct with fields: source, topic, and data" )
76
- }
77
-
78
- fn visit_map < A : MapAccess < ' de > > (
79
- self ,
80
- mut map : A ,
81
- ) -> Result < Self :: Value , A :: Error > {
82
- let ( mut source, mut topic, mut data) = ( None , None , None ) ;
83
- while let Some ( key) = map. next_key ( ) ? {
84
- match key {
85
- "source" => {
86
- if source. is_some ( ) {
87
- return Err ( SerdeError :: duplicate_field (
88
- "source" ,
89
- ) ) ;
90
- }
91
- source = Some ( map. next_value ( ) ?) ;
92
- }
93
- "topic" => {
94
- if topic. is_some ( ) {
95
- return Err ( SerdeError :: duplicate_field (
96
- "topic" ,
97
- ) ) ;
98
- }
99
- topic = Some ( map. next_value ( ) ?) ;
100
- }
101
- "data" => {
102
- if data. is_some ( ) {
103
- return Err ( SerdeError :: duplicate_field (
104
- "data" ,
105
- ) ) ;
106
- }
107
- data = Some ( map. next_value ( ) ?) ;
108
- }
109
- field => {
110
- return Err ( SerdeError :: unknown_field (
111
- field,
112
- & [ "source" , "topic" , "data" ] ,
113
- ) )
114
- }
115
- } ;
116
- }
117
- let data: String =
118
- data. ok_or_else ( || SerdeError :: missing_field ( "data" ) ) ?;
119
- let data = BASE64_STANDARD . decode ( data) . map_err ( |e| {
120
- SerdeError :: custom ( format ! (
121
- "failed to base64 decode Event data: {e}"
122
- ) )
123
- } ) ?;
124
- Ok ( Event {
125
- source : source
126
- . ok_or_else ( || SerdeError :: missing_field ( "source" ) ) ?,
127
- topic : topic
128
- . ok_or_else ( || SerdeError :: missing_field ( "topic" ) ) ?,
129
- data,
130
- } )
131
- }
50
+ #[ derive( Deserialize ) ]
51
+ struct IntermediateEvent {
52
+ source : ContractId ,
53
+ topic : String ,
54
+ data : String ,
132
55
}
133
56
134
- deserializer. deserialize_struct (
135
- "Event" ,
136
- & [ "source" , "topic" , "data" ] ,
137
- StructVisitor ,
138
- )
57
+ let intermediate: IntermediateEvent =
58
+ Deserialize :: deserialize ( deserializer) ?;
59
+ let data = hex:: decode ( & intermediate. data )
60
+ . map_err ( serde:: de:: Error :: custom) ?;
61
+ Ok ( Event {
62
+ source : intermediate. source ,
63
+ topic : intermediate. topic ,
64
+ data,
65
+ } )
139
66
}
140
67
}
0 commit comments