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 }
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}