This commit is contained in:
Igor Katson 2021-07-12 11:56:26 +01:00
parent f6656841c0
commit 950d47ab31
7 changed files with 451 additions and 167 deletions

View file

@ -10,6 +10,8 @@ use serde::{
Deserialize, Deserializer, Serialize,
};
use crate::id20::Id20;
#[derive(Debug)]
enum MessageType {
Request,
@ -17,57 +19,6 @@ enum MessageType {
Error,
}
#[derive(Clone, Copy)]
pub struct Id20(pub [u8; 20]);
impl std::fmt::Debug for Id20 {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "<")?;
for byte in self.0 {
write!(f, "{:02x?}", byte)?;
}
write!(f, ">")?;
Ok(())
}
}
impl Serialize for Id20 {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_bytes(&self.0)
}
}
impl<'de> Deserialize<'de> for Id20 {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct Visitor;
impl<'de> serde::de::Visitor<'de> for Visitor {
type Value = Id20;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(formatter, "a 20 byte slice")
}
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
if v.len() != 20 {
return Err(E::invalid_length(20, &self));
}
let mut buf = [0u8; 20];
buf.copy_from_slice(&v);
Ok(Id20(buf))
}
}
deserializer.deserialize_bytes(Visitor {})
}
}
impl<'de> Deserialize<'de> for MessageType {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where