@@ -107,6 +107,7 @@ impl std::fmt::Debug for NodeId {
107
107
/// Serialize with the 0x prefix.
108
108
#[ cfg( feature = "serde" ) ]
109
109
mod serde_hex_prfx {
110
+
110
111
pub fn serialize < T : AsRef < [ u8 ] > + hex:: ToHex , S : serde:: Serializer > (
111
112
data : & T ,
112
113
serializer : S ,
@@ -122,8 +123,16 @@ mod serde_hex_prfx {
122
123
T : hex:: FromHex ,
123
124
<T as hex:: FromHex >:: Error : std:: fmt:: Display ,
124
125
{
125
- let raw: & [ u8 ] = serde:: Deserialize :: deserialize ( deserializer) ?;
126
- let src = raw. strip_prefix ( b"0x" ) . unwrap_or ( raw) ;
126
+ /// Helper struct to obtain a owned string when necessary (using [`serde_json`], for
127
+ /// example) or a borrowed string with the appropriate lifetime (most the time).
128
+ // NOTE: see https://github.com/serde-rs/serde/issues/1413#issuecomment-494892266 and
129
+ // https://github.com/sigp/enr/issues/62
130
+ #[ derive( serde:: Deserialize ) ]
131
+ struct CowNodeId < ' a > ( #[ serde( borrow) ] std:: borrow:: Cow < ' a , str > ) ;
132
+
133
+ let CowNodeId :: < ' de > ( raw) = serde:: Deserialize :: deserialize ( deserializer) ?;
134
+
135
+ let src = raw. strip_prefix ( "0x" ) . unwrap_or ( & raw ) ;
127
136
hex:: FromHex :: from_hex ( src) . map_err ( serde:: de:: Error :: custom)
128
137
}
129
138
}
@@ -143,12 +152,28 @@ mod tests {
143
152
144
153
#[ cfg( feature = "serde" ) ]
145
154
#[ test]
146
- fn test_serde ( ) {
155
+ fn test_serde_str ( ) {
147
156
let node = NodeId :: random ( ) ;
148
157
let json_string = serde_json:: to_string ( & node) . unwrap ( ) ;
149
158
assert_eq ! ( node, serde_json:: from_str:: <NodeId >( & json_string) . unwrap( ) ) ;
150
159
}
151
160
161
+ #[ cfg( feature = "serde" ) ]
162
+ #[ test]
163
+ fn test_serde_slice ( ) {
164
+ let node = NodeId :: random ( ) ;
165
+ let json_bytes = serde_json:: to_vec ( & node) . unwrap ( ) ;
166
+ assert_eq ! ( node, serde_json:: from_slice:: <NodeId >( & json_bytes) . unwrap( ) ) ;
167
+ }
168
+
169
+ #[ cfg( feature = "serde" ) ]
170
+ #[ test]
171
+ fn test_serde_value ( ) {
172
+ let node = NodeId :: random ( ) ;
173
+ let value = serde_json:: to_value ( & node) . unwrap ( ) ;
174
+ assert_eq ! ( node, serde_json:: from_value:: <NodeId >( value) . unwrap( ) ) ;
175
+ }
176
+
152
177
#[ cfg( feature = "serde" ) ]
153
178
#[ test]
154
179
fn test_serde_0x ( ) {
0 commit comments