epee_serde/value/
de.rs

1use std::collections::HashMap;
2use std::fmt;
3
4use serde::de;
5use serde::de::DeserializeSeed;
6use serde::{de::Visitor, Deserialize};
7
8use super::Value;
9
10macro_rules! visit {
11    ($fn:ident, $typ:ty, $field:ident) => {
12        fn $fn<E>(self, v: $typ) -> Result<Self::Value, E>
13        where
14            E: serde::de::Error,
15        {
16            Ok(Value::$field(v))
17        }
18    };
19}
20
21impl<'de> Deserialize<'de> for Value {
22    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
23    where
24        D: serde::Deserializer<'de>,
25    {
26        struct ValueVisitor;
27
28        impl<'de> Visitor<'de> for ValueVisitor {
29            type Value = Value;
30            fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
31                formatter.write_str("any valid epee value")
32            }
33
34            visit!(visit_i64, i64, I64);
35            visit!(visit_i32, i32, I32);
36            visit!(visit_i16, i16, I16);
37            visit!(visit_i8, i8, I8);
38            visit!(visit_u64, u64, U64);
39            visit!(visit_u32, u32, U32);
40            visit!(visit_u16, u16, U16);
41            visit!(visit_u8, u8, U8);
42            visit!(visit_f64, f64, F64);
43            visit!(visit_byte_buf, Vec<u8>, Bytes);
44            visit!(visit_bool, bool, Bool);
45
46            fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
47            where
48                A: serde::de::MapAccess<'de>,
49            {
50                let mut output: HashMap<String, Value> = HashMap::new();
51                while let Some(key) = map.next_key()? {
52                    let val = map.next_value()?;
53                    output.insert(key, val);
54                }
55
56                Ok(Value::Object(output))
57            }
58            //visit!(visit_map, HashMap<String, Value>, Object);
59        }
60
61        deserializer.deserialize_any(ValueVisitor)
62    }
63}
64
65struct KeyDeserializer;
66
67impl<'de> DeserializeSeed<'de> for KeyDeserializer {
68    type Value = String;
69
70    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
71    where
72        D: serde::Deserializer<'de>,
73    {
74        deserializer.deserialize_str(self)
75    }
76}
77
78impl<'de> Visitor<'de> for KeyDeserializer {
79    type Value = String;
80
81    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
82        formatter.write_str("a string key")
83    }
84
85    fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
86    where
87        E: de::Error,
88    {
89        Ok(s.to_string())
90    }
91
92    fn visit_string<E>(self, s: String) -> Result<Self::Value, E>
93    where
94        E: de::Error,
95    {
96        Ok(s)
97    }
98}