keyvalues_parser/
serde.rs

1use std::{borrow::Cow, collections::BTreeMap, fmt};
2
3use crate::{Obj, Value};
4
5use serde_core::{
6    de::{MapAccess, Visitor},
7    Deserialize, Deserializer,
8};
9
10fn value_string(s: impl ToString) -> Value<'static> {
11    Value::Str(s.to_string().into())
12}
13
14struct ValueVisitor;
15
16impl<'a> Visitor<'a> for ValueVisitor {
17    type Value = Value<'a>;
18
19    fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
20        f.write_str("any valid VDF value")
21    }
22
23    fn visit_borrowed_str<E>(self, s: &'a str) -> Result<Self::Value, E> {
24        Ok(Value::Str(Cow::Borrowed(s)))
25    }
26
27    fn visit_str<E>(self, s: &str) -> Result<Self::Value, E> {
28        Ok(value_string(s))
29    }
30
31    fn visit_string<E>(self, s: String) -> Result<Self::Value, E> {
32        Ok(Value::Str(Cow::Owned(s)))
33    }
34
35    fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
36    where
37        V: MapAccess<'a>,
38    {
39        let mut obj = BTreeMap::new();
40        while let Some((key, value)) = visitor.next_entry()? {
41            obj.insert(key, value);
42        }
43        Ok(Value::Obj(crate::Obj(obj)))
44    }
45}
46
47impl<'de: 'a, 'a> Deserialize<'de> for Value<'a> {
48    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
49    where
50        D: Deserializer<'de>,
51    {
52        deserializer.deserialize_any(ValueVisitor)
53    }
54}
55
56struct ObjVisitor;
57
58impl<'a> Visitor<'a> for ObjVisitor {
59    type Value = Obj<'a>;
60
61    fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
62        f.write_str("an object")
63    }
64
65    fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
66    where
67        V: MapAccess<'a>,
68    {
69        let mut obj = BTreeMap::new();
70        while let Some((key, value)) = visitor.next_entry()? {
71            obj.insert(key, value);
72        }
73        Ok(Obj(obj))
74    }
75}
76
77impl<'de: 'a, 'a> Deserialize<'de> for Obj<'a> {
78    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
79    where
80        D: Deserializer<'de>,
81    {
82        deserializer.deserialize_map(ObjVisitor)
83    }
84}