use serde::{Deserialize, Serialize};
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct Aaguid(pub [u8; Self::LEN]);
impl Aaguid {
const LEN: usize = 16;
pub const fn new_empty() -> Self {
Self([0; 16])
}
}
impl Default for Aaguid {
fn default() -> Self {
Self::new_empty()
}
}
impl From<[u8; 16]> for Aaguid {
fn from(inner: [u8; 16]) -> Self {
Aaguid(inner)
}
}
impl Serialize for Aaguid {
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 Aaguid {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
struct AaguidVisitior;
impl serde::de::Visitor<'_> for AaguidVisitior {
type Value = Aaguid;
fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "A byte string of {} bytes long", Aaguid::LEN)
}
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
v.try_into().map(Aaguid).map_err(|_| {
E::custom(format!("Byte string of len {}, is not of len 16", v.len()))
})
}
}
deserializer.deserialize_bytes(AaguidVisitior)
}
}
#[cfg(test)]
mod tests;