conundrum 0.1.0

Hard-to-misuse crypto primitives with purpose scoping.
Documentation
use core::convert::TryInto;

use serde::de::Error;
use serde::{Deserializer, Serializer};

/// This just specializes [`serde_bytes::serialize`] to `<T = [u8]>`.
pub(crate) fn serialize<S>(bytes: &[u8], serializer: S) -> Result<S::Ok, S::Error>
where
    S: Serializer,
{
    serde_bytes::serialize(bytes, serializer)
}

/// This takes the result of [`serde_bytes::deserialize`] from `[u8]` to `[u8; N]`.
pub(crate) fn deserialize<'de, D, const N: usize>(deserializer: D) -> Result<[u8; N], D::Error>
where
    D: Deserializer<'de>,
{
    let bytes: Vec<u8> = serde_bytes::deserialize(deserializer)?;
    let array: [u8; N] = bytes.as_slice().try_into().map_err(|_| {
        let expected = format!("[u8; {}]", N);
        D::Error::invalid_length(bytes.len(), &expected.as_str())
    })?;
    Ok(array)
}