flowcore 0.91.0

Structures shared between runtime and clients
Documentation
use std::fmt;
use std::marker::PhantomData;

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

use crate::model::datatype::DataType;

pub fn datatype_or_datatype_array<'de, D>(deserializer: D) -> Result<Vec<DataType>, D::Error>
where
    D: Deserializer<'de>,
{
    struct StringOrVec(PhantomData<Vec<DataType>>);

    impl<'de> de::Visitor<'de> for StringOrVec {
        type Value = Vec<DataType>;

        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
            formatter.write_str("DataType or list of DataTypes")
        }

        fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
        where
            E: de::Error,
        {
            Ok(vec![DataType::from(value)])
        }

        fn visit_seq<S>(self, visitor: S) -> Result<Self::Value, S::Error>
        where
            S: de::SeqAccess<'de>,
        {
            Deserialize::deserialize(de::value::SeqAccessDeserializer::new(visitor))
        }
    }

    deserializer.deserialize_any(StringOrVec(PhantomData))
}