keyvalues_parser/
serde.rs1use 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}