Skip to content

Commit 47b3382

Browse files
committed
Add serde macros for public keys
1 parent 45a4459 commit 47b3382

File tree

2 files changed

+75
-65
lines changed

2 files changed

+75
-65
lines changed

src/key.rs

Lines changed: 1 addition & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -404,71 +404,7 @@ impl From<ffi::PublicKey> for PublicKey {
404404
}
405405
}
406406

407-
#[cfg(feature = "serde")]
408-
impl ::serde::Serialize for PublicKey {
409-
fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
410-
if s.is_human_readable() {
411-
s.collect_str(self)
412-
} else {
413-
s.serialize_bytes(&self.serialize())
414-
}
415-
}
416-
}
417-
418-
#[cfg(feature = "serde")]
419-
impl<'de> ::serde::Deserialize<'de> for PublicKey {
420-
fn deserialize<D: ::serde::Deserializer<'de>>(d: D) -> Result<PublicKey, D::Error> {
421-
if d.is_human_readable() {
422-
struct HexVisitor;
423-
424-
impl<'de> ::serde::de::Visitor<'de> for HexVisitor {
425-
type Value = PublicKey;
426-
427-
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
428-
formatter.write_str("an ASCII hex string")
429-
}
430-
431-
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
432-
where
433-
E: ::serde::de::Error,
434-
{
435-
if let Ok(hex) = str::from_utf8(v) {
436-
str::FromStr::from_str(hex).map_err(E::custom)
437-
} else {
438-
Err(E::invalid_value(::serde::de::Unexpected::Bytes(v), &self))
439-
}
440-
}
441-
442-
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
443-
where
444-
E: ::serde::de::Error,
445-
{
446-
str::FromStr::from_str(v).map_err(E::custom)
447-
}
448-
}
449-
d.deserialize_str(HexVisitor)
450-
} else {
451-
struct BytesVisitor;
452-
453-
impl<'de> ::serde::de::Visitor<'de> for BytesVisitor {
454-
type Value = PublicKey;
455-
456-
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
457-
formatter.write_str("a bytestring")
458-
}
459-
460-
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
461-
where
462-
E: ::serde::de::Error,
463-
{
464-
PublicKey::from_slice(v).map_err(E::custom)
465-
}
466-
}
467-
468-
d.deserialize_bytes(BytesVisitor)
469-
}
470-
}
471-
}
407+
serde_impl_from_slice!(PublicKey);
472408

473409
#[cfg(test)]
474410
mod test {

src/macros.rs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,77 @@ macro_rules! serde_impl(
8787
macro_rules! serde_impl(
8888
($t:ident, $len:expr) => ()
8989
);
90+
91+
#[cfg(feature = "serde")]
92+
macro_rules! serde_impl_from_slice {
93+
($t: ident) => {
94+
impl ::serde::Serialize for $t {
95+
fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
96+
if s.is_human_readable() {
97+
s.collect_str(self)
98+
} else {
99+
s.serialize_bytes(&self.serialize())
100+
}
101+
}
102+
}
103+
104+
impl<'de> ::serde::Deserialize<'de> for $t {
105+
fn deserialize<D: ::serde::Deserializer<'de>>(d: D) -> Result<$t, D::Error> {
106+
if d.is_human_readable() {
107+
struct HexVisitor;
108+
109+
impl<'de> ::serde::de::Visitor<'de> for HexVisitor {
110+
type Value = $t;
111+
112+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
113+
formatter.write_str("an ASCII hex string")
114+
}
115+
116+
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
117+
where
118+
E: ::serde::de::Error,
119+
{
120+
if let Ok(hex) = str::from_utf8(v) {
121+
str::FromStr::from_str(hex).map_err(E::custom)
122+
} else {
123+
Err(E::invalid_value(::serde::de::Unexpected::Bytes(v), &self))
124+
}
125+
}
126+
127+
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
128+
where
129+
E: ::serde::de::Error,
130+
{
131+
str::FromStr::from_str(v).map_err(E::custom)
132+
}
133+
}
134+
d.deserialize_str(HexVisitor)
135+
} else {
136+
struct BytesVisitor;
137+
138+
impl<'de> ::serde::de::Visitor<'de> for BytesVisitor {
139+
type Value = $t;
140+
141+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
142+
formatter.write_str("a bytestring")
143+
}
144+
145+
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
146+
where
147+
E: ::serde::de::Error,
148+
{
149+
$t::from_slice(v).map_err(E::custom)
150+
}
151+
}
152+
153+
d.deserialize_bytes(BytesVisitor)
154+
}
155+
}
156+
}
157+
};
158+
}
159+
160+
#[cfg(not(feature = "serde"))]
161+
macro_rules! serde_impl_from_slice(
162+
($t:ident) => ()
163+
);

0 commit comments

Comments
 (0)