asterix_parser 0.1.1

Playground do Protocolo ASTERIX
Documentation
use std::fmt;
use std::marker::PhantomData;
use serde::Deserializer;
use serde::Deserialize;

#[derive(Deserialize, Debug)]
#[serde(transparent)]

struct Outer {
    #[serde(deserialize_with = "deserialize_vec")]
    data: Vec<f64>,
}

fn deserialize_vec<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
    where
        D: Deserializer<'de>,
        T: Deserialize<'de> + Default,
{
    use serde::de::{SeqAccess, Visitor};

    struct SeqVisitor<T>(PhantomData<T>);

    impl<'de, T> Visitor<'de> for SeqVisitor<T>
    where
        T: Deserialize<'de> + Default,
    {
        type Value = Vec<T>;

        fn expecting(&self, fmt: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
            fmt.write_str("default vec")
        }

        fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
            let mut vec = Vec::new();
            while let Ok(Some(elem)) = seq.next_element::<Option<T>>() {
                let val = elem.unwrap_or_default(); 
                vec.push(val);
            }
            Ok(vec)
        }
    }
    deserializer.deserialize_seq(SeqVisitor(PhantomData))
}

#[test]
fn test() {
    let ret = serde_json::from_str::<Outer>( "[]").unwrap();
    dbg!(ret.data);
}