use std::marker::PhantomData; use serde::{ de::{self, Visitor}, Deserialize, Deserializer, Serialize, }; use super::key::Key; #[cfg_attr(test, derive(PartialEq, Eq, Debug))] pub struct InnerFunc(pub(crate) Vec>); #[cfg_attr(test, derive(PartialEq, Eq, Debug))] pub struct FuncKeyValue { pub key: Key, pub values: T, } impl Clone for FuncKeyValue { fn clone(&self) -> Self { Self { key: self.key.clone(), values: self.values.clone(), } } } impl Clone for InnerFunc { fn clone(&self) -> Self { Self(self.0.clone()) } } impl Serialize for InnerFunc { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { use serde::ser::SerializeMap; let mut map = serializer.serialize_map(Some(self.0.len()))?; for kv in self.0.iter() { map.serialize_key(&kv.key)?; map.serialize_value(&kv.values)?; } map.end() } } impl<'de, T> Deserialize<'de> for InnerFunc where T: Deserialize<'de>, { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct FuncVisitor(PhantomData); impl<'v, T> Visitor<'v> for FuncVisitor where T: Deserialize<'v>, { type Value = InnerFunc; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { formatter.write_str("struct StringFunc") } fn visit_map(self, mut map: A) -> Result where A: de::MapAccess<'v>, { use serde::de::Error; let mut inner = Vec::with_capacity(map.size_hint().unwrap_or(0)); while let Some((key, values)) = map.next_entry::()? { inner.push(FuncKeyValue { key, values }); } if inner.is_empty() { return Err(Error::custom("has no condition key")); } Ok(InnerFunc(inner)) } } deserializer.deserialize_map(FuncVisitor::(PhantomData)) } }