pbjson_types/
list_value.rs

1use crate::ListValue;
2
3impl From<Vec<crate::Value>> for ListValue {
4    fn from(values: Vec<crate::Value>) -> Self {
5        Self { values }
6    }
7}
8
9impl<const N: usize> From<[crate::Value; N]> for ListValue {
10    fn from(values: [crate::Value; N]) -> Self {
11        Self {
12            values: values.into(),
13        }
14    }
15}
16
17impl FromIterator<crate::value::Kind> for ListValue {
18    fn from_iter<T>(iter: T) -> Self
19    where
20        T: IntoIterator<Item = crate::value::Kind>,
21    {
22        Self {
23            values: iter.into_iter().map(Into::into).collect(),
24        }
25    }
26}
27
28impl FromIterator<crate::Value> for ListValue {
29    fn from_iter<T>(iter: T) -> Self
30    where
31        T: IntoIterator<Item = crate::Value>,
32    {
33        Self {
34            values: iter.into_iter().collect(),
35        }
36    }
37}
38
39impl serde::Serialize for ListValue {
40    fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
41    where
42        S: serde::Serializer,
43    {
44        self.values.serialize(ser)
45    }
46}
47
48impl<'de> serde::Deserialize<'de> for ListValue {
49    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
50    where
51        D: serde::Deserializer<'de>,
52    {
53        deserializer.deserialize_seq(ListValueVisitor)
54    }
55}
56
57struct ListValueVisitor;
58
59impl<'de> serde::de::Visitor<'de> for ListValueVisitor {
60    type Value = ListValue;
61
62    fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
63        formatter.write_str("google.protobuf.ListValue")
64    }
65
66    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
67    where
68        A: serde::de::SeqAccess<'de>,
69    {
70        let mut list = Vec::new();
71
72        while let Some(value) = seq.next_element()? {
73            list.push(value);
74        }
75
76        Ok(list.into())
77    }
78}
79
80#[cfg(test)]
81mod tests {
82    use crate::Value;
83
84    #[test]
85    fn mixed_types() {
86        assert_eq!(
87            serde_json::to_value(Value::from([true.into(), "HELLO".into(), false.into()])).unwrap(),
88            serde_json::json!([true, "HELLO", false])
89        );
90    }
91
92    #[test]
93    fn list_value() {
94        assert_eq!(
95            serde_json::to_value(Value::from([false.into(), true.into(), false.into()])).unwrap(),
96            serde_json::json!([false, true, false])
97        );
98        assert_eq!(
99            serde_json::to_value(Value::from(true)).unwrap(),
100            serde_json::json!(true)
101        );
102    }
103}