Skip to content

Commit 06dcf9d

Browse files
fix: Make NodeId deserializable from serde_json::Value (#63)
Co-authored-by: Diva M <[email protected]>
1 parent ee6a8d9 commit 06dcf9d

File tree

1 file changed

+28
-3
lines changed

1 file changed

+28
-3
lines changed

src/node_id.rs

+28-3
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ impl std::fmt::Debug for NodeId {
107107
/// Serialize with the 0x prefix.
108108
#[cfg(feature = "serde")]
109109
mod serde_hex_prfx {
110+
110111
pub fn serialize<T: AsRef<[u8]> + hex::ToHex, S: serde::Serializer>(
111112
data: &T,
112113
serializer: S,
@@ -122,8 +123,16 @@ mod serde_hex_prfx {
122123
T: hex::FromHex,
123124
<T as hex::FromHex>::Error: std::fmt::Display,
124125
{
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);
127136
hex::FromHex::from_hex(src).map_err(serde::de::Error::custom)
128137
}
129138
}
@@ -143,12 +152,28 @@ mod tests {
143152

144153
#[cfg(feature = "serde")]
145154
#[test]
146-
fn test_serde() {
155+
fn test_serde_str() {
147156
let node = NodeId::random();
148157
let json_string = serde_json::to_string(&node).unwrap();
149158
assert_eq!(node, serde_json::from_str::<NodeId>(&json_string).unwrap());
150159
}
151160

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+
152177
#[cfg(feature = "serde")]
153178
#[test]
154179
fn test_serde_0x() {

0 commit comments

Comments
 (0)