warcat 0.3.0

Command-line tool and library for handling Web ARChive (WARC) files
Documentation
use std::marker::PhantomData;

use serde::{de::Visitor, Deserialize, Deserializer};

use super::FieldMap;

struct FieldMapVisitor<N, V> {
    _n: PhantomData<N>,
    _v: PhantomData<V>,
}

impl<N, V> FieldMapVisitor<N, V> {
    fn new() -> Self {
        Self {
            _n: PhantomData,
            _v: PhantomData,
        }
    }
}

impl<'de, N, V> Visitor<'de> for FieldMapVisitor<N, V>
where
    N: Deserialize<'de>,
    V: Deserialize<'de>,
{
    type Value = FieldMap<N, V>;

    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
        formatter.write_str("sequence of two-item tuples")
    }

    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
    where
        A: serde::de::SeqAccess<'de>,
    {
        let mut items = Vec::new();

        while let Some(item) = seq.next_element()? {
            items.push(item);
        }

        Ok(FieldMap { fields: items })
    }
}

impl<'de, N, V> Deserialize<'de> for FieldMap<N, V>
where
    N: Deserialize<'de>,
    V: Deserialize<'de>,
{
    fn deserialize<D>(deserializer: D) -> Result<FieldMap<N, V>, D::Error>
    where
        D: Deserializer<'de>,
    {
        deserializer.deserialize_seq(FieldMapVisitor::new())
    }
}