Skip to content

Commit 8e781c5

Browse files
authored
deps: replace serde-hex with custom serialize (#45)
1 parent ebbcd45 commit 8e781c5

File tree

2 files changed

+43
-6
lines changed

2 files changed

+43
-6
lines changed

Cargo.toml

+1-3
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,14 @@ exclude = [".gitignore", ".github/*"]
1414
[dependencies]
1515
base64 = "0.21.0"
1616
bytes = "1"
17-
hex = {version = "0.4.2"}
17+
hex = { version = "0.4.2" }
1818
log = "0.4.8"
1919
rand = "0.8"
2020
rlp = "0.5"
2121
zeroize = "1.1.0"
2222
sha3 = "0.10"
2323
k256 = { version = "0.13", features = ["ecdsa"], optional = true }
2424
serde = { version = "1.0.110", features = ["derive"], optional = true }
25-
serde-hex = { version = "0.1.0", optional = true}
2625
ed25519-dalek = { version = "2.0.0", optional = true, features = ["rand_core"] }
2726
secp256k1 = { version = "0.27", optional = true, default-features = false, features = [
2827
"global-context",
@@ -36,7 +35,6 @@ serde_json = { version = "1.0.95" }
3635
default = ["serde", "k256"]
3736
ed25519 = ["ed25519-dalek"]
3837
rust-secp256k1 = ["secp256k1"]
39-
serde = ["dep:serde", "dep:serde-hex"]
4038

4139
[lib]
4240
name = "enr"

src/node_id.rs

+42-3
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,14 @@
44
use crate::{digest, keys::EnrPublicKey, Enr, EnrKey};
55
#[cfg(feature = "serde")]
66
use serde::{Deserialize, Serialize};
7-
#[cfg(feature = "serde")]
8-
use serde_hex::{SerHex, StrictPfx};
97

108
type RawNodeId = [u8; 32];
119

1210
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(transparent))]
1311
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
1412
/// The `NodeId` of an ENR (a 32 byte identifier).
1513
pub struct NodeId {
16-
#[cfg_attr(feature = "serde", serde(with = "SerHex::<StrictPfx>"))]
14+
#[cfg_attr(feature = "serde", serde(with = "serde_hex_prfx"))]
1715
raw: RawNodeId,
1816
}
1917

@@ -106,6 +104,30 @@ impl std::fmt::Debug for NodeId {
106104
}
107105
}
108106

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+
109131
#[cfg(test)]
110132
mod tests {
111133
use super::*;
@@ -127,6 +149,23 @@ mod tests {
127149
assert_eq!(node, serde_json::from_str::<NodeId>(&json_string).unwrap());
128150
}
129151

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+
130169
#[cfg(feature = "serde")]
131170
#[test]
132171
fn test_serde_as_hashmap_key() {

0 commit comments

Comments
 (0)