diff --git a/zebra-network/src/serialization.rs b/zebra-network/src/serialization.rs index 0871d0c80..a8b35a103 100644 --- a/zebra-network/src/serialization.rs +++ b/zebra-network/src/serialization.rs @@ -167,3 +167,55 @@ pub trait ZcashSerialization: Sized { version: Version, ) -> Result; } + +impl ZcashSerialization for std::net::IpAddr { + fn write( + &self, + mut writer: W, + _magic: Magic, + _version: Version, + ) -> Result<(), SerializationError> { + use std::net::IpAddr::*; + let v6_addr = match *self { + V4(ref addr) => addr.to_ipv6_mapped(), + V6(addr) => addr, + }; + writer.write_all(&v6_addr.octets())?; + Ok(()) + } + + /// Try to read `self` from the given `reader`. + fn try_read( + _reader: R, + _magic: Magic, + _version: Version, + ) -> Result { + unimplemented!() + } +} + +// XXX because the serialization trait has both read and write methods, we have +// to implement it for String rather than impl<'a> ... for &'a str (as in that +// case we can't deserialize into a borrowed &'str, only an owned String), so we +// can't serialize 'static str +impl ZcashSerialization for String { + fn write( + &self, + mut writer: W, + _magic: Magic, + _version: Version, + ) -> Result<(), SerializationError> { + writer.write_compactsize(self.len() as u64)?; + writer.write_all(self.as_bytes())?; + Ok(()) + } + + /// Try to read `self` from the given `reader`. + fn try_read( + _reader: R, + _magic: Magic, + _version: Version, + ) -> Result { + unimplemented!() + } +} \ No newline at end of file