1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
use std::fmt; use serde::de; use crate::schema::Schema; #[derive(Debug)] pub struct Property { name: String, schema: Schema, } impl Property { pub fn name(&self) -> &str { &self.name } pub fn schema(&self) -> &Schema { &self.schema } } struct PropertyVisitor; impl<'de> de::Visitor<'de> for PropertyVisitor { type Value = Property; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("expected property") } fn visit_map<M>(self, mut access: M) -> Result<Self::Value, M::Error> where M: de::MapAccess<'de>, { if let Some((name, schema)) = access.next_entry()? { return Ok(Property { name, schema }); } Err(de::Error::custom("unable to deserialize property from empty map")) } } impl<'de> de::Deserialize<'de> for Property { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: de::Deserializer<'de>, { deserializer.deserialize_map(PropertyVisitor) } }