use crate::ByteArray;
use core::fmt;
use core::marker::PhantomData;
use serde::{
de::{Error, Visitor},
Deserializer,
};
pub trait Deserialize<'de>: Sized {
#[allow(missing_docs)]
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>;
}
impl<'de, const N: usize> Deserialize<'de> for [u8; N] {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let arr: ByteArray<N> = serde::Deserialize::deserialize(deserializer)?;
Ok(*arr)
}
}
impl<'de, const N: usize> Deserialize<'de> for ByteArray<N> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
serde::Deserialize::deserialize(deserializer)
}
}
impl<'de, const N: usize> Deserialize<'de> for &'de ByteArray<N> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
serde::Deserialize::deserialize(deserializer)
}
}
impl<'de, const N: usize> Deserialize<'de> for &'de [u8; N] {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
<&'de ByteArray<N>>::deserialize(deserializer).map(Into::into)
}
}
impl<'de, T> Deserialize<'de> for Option<T>
where
T: Deserialize<'de>,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct BytesVisitor<T> {
out: PhantomData<T>,
}
impl<'de, T> Visitor<'de> for BytesVisitor<T>
where
T: Deserialize<'de>,
{
type Value = Option<T>;
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("optional byte array")
}
fn visit_unit<E: Error>(self) -> Result<Self::Value, E> {
Ok(None)
}
fn visit_none<E: Error>(self) -> Result<Self::Value, E> {
Ok(None)
}
fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
T::deserialize(deserializer).map(Some)
}
}
let visitor = BytesVisitor { out: PhantomData };
deserializer.deserialize_option(visitor)
}
}