use std::fmt; use serde::{de::{self, Visitor}, Deserialize, Deserializer}; use crate::pattern::Pattern; #[derive(Debug, Deserialize)] pub(super) struct OpenRule { pub(super) name: Option, pub(super) mime: Option, #[serde(rename = "use")] #[serde(deserialize_with = "OpenRule::deserialize")] pub(super) use_: Vec, } impl OpenRule { fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, { struct UseVisitor; impl<'de> Visitor<'de> for UseVisitor { type Value = Vec; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("a string, or array of strings") } fn visit_seq(self, mut seq: A) -> Result where A: de::SeqAccess<'de>, { let mut uses = Vec::new(); while let Some(use_) = seq.next_element::()? { uses.push(use_); } Ok(uses) } fn visit_str(self, value: &str) -> Result where E: de::Error, { Ok(vec![value.to_owned()]) } fn visit_string(self, v: String) -> Result where E: de::Error, { Ok(vec![v]) } } deserializer.deserialize_any(UseVisitor) } }