pbjson_types/
list_value.rs1use 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}