mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-05-06 16:12:18 +00:00
Decode multiaddresses from visit_seq (#944)
* Decode multiaddresses from visit_seq * Serialize as slices
This commit is contained in:
parent
2d31c2f733
commit
31dfbf39b9
@ -36,9 +36,9 @@ impl Serialize for Multiaddr {
|
|||||||
S: Serializer,
|
S: Serializer,
|
||||||
{
|
{
|
||||||
if serializer.is_human_readable() {
|
if serializer.is_human_readable() {
|
||||||
self.to_string().serialize(serializer)
|
serializer.serialize_str(&self.to_string())
|
||||||
} else {
|
} else {
|
||||||
self.to_bytes().serialize(serializer)
|
serializer.serialize_bytes(self.as_slice())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -48,7 +48,7 @@ impl<'de> Deserialize<'de> for Multiaddr {
|
|||||||
where
|
where
|
||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
{
|
{
|
||||||
struct Visitor;
|
struct Visitor { is_human_readable: bool };
|
||||||
|
|
||||||
impl<'de> de::Visitor<'de> for Visitor {
|
impl<'de> de::Visitor<'de> for Visitor {
|
||||||
type Value = Multiaddr;
|
type Value = Multiaddr;
|
||||||
@ -56,6 +56,16 @@ impl<'de> Deserialize<'de> for Multiaddr {
|
|||||||
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
formatter.write_str("multiaddress")
|
formatter.write_str("multiaddress")
|
||||||
}
|
}
|
||||||
|
fn visit_seq<A: de::SeqAccess<'de>>(self, mut seq: A) -> StdResult<Self::Value, A::Error> {
|
||||||
|
let mut buf: Vec<u8> = Vec::with_capacity(seq.size_hint().unwrap_or(0));
|
||||||
|
while let Some(e) = seq.next_element()? { buf.push(e); }
|
||||||
|
if self.is_human_readable {
|
||||||
|
let s = String::from_utf8(buf).map_err(DeserializerError::custom)?;
|
||||||
|
s.parse().map_err(DeserializerError::custom)
|
||||||
|
} else {
|
||||||
|
Multiaddr::from_bytes(buf).map_err(DeserializerError::custom)
|
||||||
|
}
|
||||||
|
}
|
||||||
fn visit_str<E: de::Error>(self, v: &str) -> StdResult<Self::Value, E> {
|
fn visit_str<E: de::Error>(self, v: &str) -> StdResult<Self::Value, E> {
|
||||||
v.parse().map_err(DeserializerError::custom)
|
v.parse().map_err(DeserializerError::custom)
|
||||||
}
|
}
|
||||||
@ -77,9 +87,9 @@ impl<'de> Deserialize<'de> for Multiaddr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if deserializer.is_human_readable() {
|
if deserializer.is_human_readable() {
|
||||||
deserializer.deserialize_str(Visitor)
|
deserializer.deserialize_str(Visitor { is_human_readable: true })
|
||||||
} else {
|
} else {
|
||||||
deserializer.deserialize_bytes(Visitor)
|
deserializer.deserialize_bytes(Visitor { is_human_readable: false })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -441,4 +451,3 @@ impl ToMultiaddr for Multiaddr {
|
|||||||
Ok(self.clone())
|
Ok(self.clone())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user