nuget_client/
util.rs

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}