use std::{fmt, marker::PhantomData}; use serde::{de, Deserialize, Deserializer}; // Allows deserialization of a single item into a vector of that item // As long as they implement the From trait pub(super) fn pull_single_into_vec<'de, D, T>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, T: From + serde::Deserialize<'de>, { struct VecComposer(PhantomData>); impl<'de, T> de::Visitor<'de> for VecComposer where T: From + serde::Deserialize<'de>, { type Value = Vec; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { let name = std::any::type_name::(); formatter.write_str(format!("expected {} or Vec<{}>", name, name).as_str()) } fn visit_str(self, value: &str) -> Result where E: de::Error, { Ok(vec![value.to_string().into()]) } fn visit_seq(self, visitor: S) -> Result where S: de::SeqAccess<'de>, { Deserialize::deserialize(de::value::SeqAccessDeserializer::new(visitor)) } } deserializer.deserialize_any(VecComposer(PhantomData)) }