1use std::fmt;
2use std::collections::HashMap;
3
4use serde::de::{Deserialize, Deserializer, Visitor, MapAccess, SeqAccess};
5use serde::ser::{Serialize, Serializer};
6
7use crate::value::{Value, ValueMap};
8
9struct ValueMapVisitor;
11
12impl<'de> Visitor<'de> for ValueMapVisitor {
13 type Value = ValueMap;
14
15 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
16 formatter.write_str("a single value or list of values (strings)")
17 }
18
19 fn visit_map<M>(self, mut access: M)
20 -> Result<Self::Value, M::Error>
21 where M: MapAccess<'de> {
22 let mut values: HashMap<String, Vec<Value>> = HashMap::new();
23 while let Some((key, value)) =
24 access.next_entry::<String, ValueVec>()? {
25 values.insert(key, value.0);
26 }
27
28 Ok(ValueMap::new(values))
29 }
30}
31
32impl <'de> Deserialize<'de> for ValueMap {
33 fn deserialize<D>(deserializer: D)
34 -> Result<Self, D::Error>
35 where D: Deserializer<'de> {
36 deserializer.deserialize_map(ValueMapVisitor {})
37 }
38}
39
40struct ValueVec(Vec<Value>);
44
45struct ValueVecVisitor;
46
47impl<'de> Visitor<'de> for ValueVecVisitor {
48 type Value = ValueVec;
49
50 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
51 formatter.write_str("a single value or list of values (strings)")
52 }
53
54 fn visit_seq<M>(self, mut access: M) -> Result<Self::Value, M::Error>
55 where M: SeqAccess<'de> {
56 let mut values = vec![];
57 while let Some(value) = access.next_element::<Value>()? {
58 values.push(value);
59 }
60
61 Ok(ValueVec(values))
62 }
63
64 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> {
65 Ok(ValueVec(vec![Value::new(value)]))
66 }
67
68 fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E> {
69 Ok(ValueVec(vec![Value::new(&format!("{}", value))]))
70 }
71
72 fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E> {
73 Ok(ValueVec(vec![Value::new(&format!("{}", value))]))
74 }
75
76 fn visit_f64<E>(self, value: f64) -> Result<Self::Value, E> {
77 Ok(ValueVec(vec![Value::new(&format!("{}", value))]))
78 }
79
80 fn visit_none<E>(self) -> Result<Self::Value, E> {
81 Ok(ValueVec(vec![]))
82 }
83
84 fn visit_unit<E>(self) -> Result<Self::Value, E> {
85 Ok(ValueVec(vec![]))
86 }
87
88 fn visit_bool<E>(self, value: bool) -> Result<Self::Value, E> {
89 Ok(ValueVec(vec![Value::new(if value {"on"} else {"off"})]))
90 }
91}
92
93impl <'de> Deserialize<'de> for ValueVec {
94 fn deserialize<D>(deserializer: D)
95 -> Result<Self, D::Error>
96 where D: Deserializer<'de> {
97 deserializer.deserialize_any(ValueVecVisitor {})
98 }
99}
100
101struct ValueVisitor;
103
104impl<'de> Visitor<'de> for ValueVisitor {
105 type Value = Value;
106
107 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
108 formatter.write_str("a single value (string)")
109 }
110
111 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> {
112 Ok(Value::new(value))
113 }
114
115 fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E> {
116 Ok(Value::new(&format!("{}", value)))
117 }
118
119 fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E> {
120 Ok(Value::new(&format!("{}", value)))
121 }
122
123 fn visit_f64<E>(self, value: f64) -> Result<Self::Value, E> {
124 Ok(Value::new(&format!("{}", value)))
125 }
126
127 fn visit_bool<E>(self, value: bool) -> Result<Self::Value, E> {
128 Ok(Value::new(if value {"on"} else {"off"}))
129 }
130}
131
132impl <'de> Deserialize<'de> for Value {
133 fn deserialize<D>(deserializer: D)
134 -> Result<Self, D::Error>
135 where D: Deserializer<'de> {
136 deserializer.deserialize_any(ValueVisitor {})
137 }
138}
139
140impl Serialize for Value {
142 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
143 where S: Serializer {
144 serializer.serialize_str(&self.as_str())
145 }
146}