es_htmlform/
serde.rs

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
9// serde Deserialize
10struct 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
40// ValueVec is only used here to register a visitor that can deal with
41// both vecs (multiple values) and strings (single values) as serialized
42// data
43struct 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
101// ValueVisitor does the same as ValueVecVisitor, minus seq support
102struct 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
140// serde Serialize
141impl 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}