*: Add Serialize and Deserialize to PeerId gossipsub MessageId and kad Key (#2408)

Co-authored-by: Max Inden <mail@max-inden.de>
This commit is contained in:
Ibiyemi Abiodun
2022-01-11 15:38:51 -05:00
committed by GitHub
parent e19391e966
commit 5617481e56
13 changed files with 142 additions and 0 deletions

View File

@ -35,6 +35,9 @@
//! define how to upgrade each individual substream to use a protocol.
//! See the `upgrade` module.
#[cfg(feature = "serde")]
extern crate _serde as serde;
mod keys_proto {
include!(concat!(env!("OUT_DIR"), "/keys_proto.rs"));
}

View File

@ -24,6 +24,9 @@ use rand::Rng;
use std::{convert::TryFrom, fmt, str::FromStr};
use thiserror::Error;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
/// Public keys with byte-lengths smaller than `MAX_INLINE_KEY_LENGTH` will be
/// automatically used as the peer id using an identity multihash.
const MAX_INLINE_KEY_LENGTH: usize = 42;
@ -164,6 +167,60 @@ impl From<PeerId> for Vec<u8> {
}
}
#[cfg(feature = "serde")]
impl Serialize for PeerId {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: _serde::Serializer,
{
if serializer.is_human_readable() {
serializer.serialize_str(&self.to_base58())
} else {
serializer.serialize_bytes(&self.to_bytes()[..])
}
}
}
#[cfg(feature = "serde")]
impl<'de> Deserialize<'de> for PeerId {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
use serde::de::*;
struct PeerIdVisitor;
impl<'de> Visitor<'de> for PeerIdVisitor {
type Value = PeerId;
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "valid peer id")
}
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
where
E: Error,
{
PeerId::from_bytes(v).map_err(|_| Error::invalid_value(Unexpected::Bytes(v), &self))
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: Error,
{
PeerId::from_str(v).map_err(|_| Error::invalid_value(Unexpected::Str(v), &self))
}
}
if deserializer.is_human_readable() {
deserializer.deserialize_str(PeerIdVisitor)
} else {
deserializer.deserialize_bytes(PeerIdVisitor)
}
}
}
#[derive(Debug, Error)]
pub enum ParseError {
#[error("base-58 decode error: {0}")]