milhouse 0.9.0

Persistent binary merkle tree
Documentation
use crate::{List, UpdateMap, Value};
use itertools::process_results;
use serde::Deserialize;
use std::marker::PhantomData;
use typenum::Unsigned;

pub struct ListVisitor<T, N, U> {
    _phantom: PhantomData<(T, N, U)>,
}

impl<T, N, U> Default for ListVisitor<T, N, U> {
    fn default() -> Self {
        Self {
            _phantom: PhantomData,
        }
    }
}

impl<'a, T, N, U> serde::de::Visitor<'a> for ListVisitor<T, N, U>
where
    T: Deserialize<'a> + Value,
    N: Unsigned,
    U: UpdateMap<T>,
{
    type Value = List<T, N, U>;

    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(formatter, "a list of T")
    }

    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
    where
        A: serde::de::SeqAccess<'a>,
    {
        process_results(
            std::iter::from_fn(|| seq.next_element().transpose()),
            |iter| {
                List::try_from_iter(iter).map_err(|e| {
                    serde::de::Error::custom(format!("Error deserializing List: {e:?}"))
                })
            },
        )?
    }
}