bitarray 0.2.4

A const generics driven bit array
Documentation
use crate::BitArray;
use core::fmt;
use serde::{
    de::{Error, Expected, Visitor},
    Deserialize, Deserializer, Serialize, Serializer,
};

impl<const B: usize> Serialize for BitArray<B> {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        self.bytes[..].serialize(serializer)
    }
}

impl<'de, const B: usize> Deserialize<'de> for BitArray<B> {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        deserializer.deserialize_bytes(BitArrayVisitor::<B>)
    }
}

struct BitArrayVisitor<const B: usize>;

impl<'de, const B: usize> Visitor<'de> for BitArrayVisitor<B> {
    type Value = BitArray<B>;

    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        write!(formatter, "[u8; {}]", B)
    }

    fn visit_bytes<E>(self, bytes: &[u8]) -> Result<Self::Value, E>
    where
        E: Error,
    {
        if bytes.len() != B {
            Err(Error::invalid_length(
                bytes.len(),
                &BitArrayExpectedBytes::<B>,
            ))
        } else {
            let mut bitarray = BitArray::<B>::zeros();
            bitarray.bytes.copy_from_slice(bytes);
            Ok(bitarray)
        }
    }
}

struct BitArrayExpectedBytes<const B: usize>;

impl<const B: usize> Expected for BitArrayExpectedBytes<B> {
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        write!(formatter, "{} bytes was expected", B)
    }
}