1use futures::SinkExt;
2use std::fmt;
3use serde::{de, Deserializer};
4
5pub fn string_or_list<'de, D>(deserializer: D) -> Result<Vec<String>, D::Error>
6where
7 D: Deserializer<'de>,
8{
9 struct Visitor;
10
11 impl<'de> de::Visitor<'de> for Visitor {
12 type Value = Vec<String>;
13
14 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
15 formatter.write_str("string or array of strings")
16 }
17
18 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
19 where E: de::Error
20 {
21 Ok(vec![String::from(value)])
22 }
23
24 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
25 where A: de::SeqAccess<'de>
26 {
27 let mut vec = Vec::with_capacity(seq.size_hint().unwrap_or(8));
28 while let Some(value) = seq.next_element()? {
29 vec.push(value);
30 }
31 Ok(vec)
32 }
33 }
34
35 deserializer.deserialize_any(Visitor)
36}