4
4
use crate :: { digest, keys:: EnrPublicKey , Enr , EnrKey } ;
5
5
#[ cfg( feature = "serde" ) ]
6
6
use serde:: { Deserialize , Serialize } ;
7
- #[ cfg( feature = "serde" ) ]
8
- use serde_hex:: { SerHex , StrictPfx } ;
9
7
10
8
type RawNodeId = [ u8 ; 32 ] ;
11
9
12
10
#[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) , serde( transparent) ) ]
13
11
#[ derive( Clone , Copy , PartialEq , Eq , Hash ) ]
14
12
/// The `NodeId` of an ENR (a 32 byte identifier).
15
13
pub struct NodeId {
16
- #[ cfg_attr( feature = "serde" , serde( with = "SerHex::<StrictPfx> " ) ) ]
14
+ #[ cfg_attr( feature = "serde" , serde( with = "serde_hex_prfx " ) ) ]
17
15
raw : RawNodeId ,
18
16
}
19
17
@@ -106,6 +104,30 @@ impl std::fmt::Debug for NodeId {
106
104
}
107
105
}
108
106
107
+ /// Serialize with the 0x prefix.
108
+ #[ cfg( feature = "serde" ) ]
109
+ mod serde_hex_prfx {
110
+ pub fn serialize < T : AsRef < [ u8 ] > + hex:: ToHex , S : serde:: Serializer > (
111
+ data : & T ,
112
+ serializer : S ,
113
+ ) -> Result < S :: Ok , S :: Error > {
114
+ let dst = format ! ( "0x{}" , hex:: encode( data) ) ;
115
+ serializer. serialize_str ( & dst)
116
+ }
117
+
118
+ /// Deserialize with the 0x prefix.
119
+ pub fn deserialize < ' de , D , T > ( deserializer : D ) -> Result < T , D :: Error >
120
+ where
121
+ D : serde:: Deserializer < ' de > ,
122
+ T : hex:: FromHex ,
123
+ <T as hex:: FromHex >:: Error : std:: fmt:: Display ,
124
+ {
125
+ let raw: & [ u8 ] = serde:: Deserialize :: deserialize ( deserializer) ?;
126
+ let src = raw. strip_prefix ( b"0x" ) . unwrap_or ( raw) ;
127
+ hex:: FromHex :: from_hex ( src) . map_err ( serde:: de:: Error :: custom)
128
+ }
129
+ }
130
+
109
131
#[ cfg( test) ]
110
132
mod tests {
111
133
use super :: * ;
@@ -127,6 +149,23 @@ mod tests {
127
149
assert_eq ! ( node, serde_json:: from_str:: <NodeId >( & json_string) . unwrap( ) ) ;
128
150
}
129
151
152
+ #[ cfg( feature = "serde" ) ]
153
+ #[ test]
154
+ fn test_serde_0x ( ) {
155
+ let raw = [
156
+ 154 , 95 , 80 , 100 , 224 , 32 , 222 , 137 , 157 , 219 , 197 , 24 , 45 , 143 , 90 , 106 , 99 , 12 , 9 ,
157
+ 93 , 44 , 66 , 196 , 203 , 35 , 233 , 26 , 59 , 50 , 128 , 168 , 180 ,
158
+ ] ;
159
+ let node = NodeId :: parse ( & raw ) . unwrap ( ) ;
160
+ let json_string = serde_json:: to_string ( & node) . unwrap ( ) ;
161
+ assert_eq ! (
162
+ json_string,
163
+ "\" 0x9a5f5064e020de899ddbc5182d8f5a6a630c095d2c42c4cb23e91a3b3280a8b4\" "
164
+ ) ;
165
+ let snode = serde_json:: from_str :: < NodeId > ( & json_string) . unwrap ( ) ;
166
+ assert_eq ! ( node, snode) ;
167
+ }
168
+
130
169
#[ cfg( feature = "serde" ) ]
131
170
#[ test]
132
171
fn test_serde_as_hashmap_key ( ) {
0 commit comments