• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use std::collections::BTreeMap;
2 use std::fmt;
3 
4 use crate::value::Value;
5 use serde::de;
6 
7 impl<'de> de::Deserialize<'de> for Value {
8     #[inline]
deserialize<D>(deserializer: D) -> Result<Value, D::Error> where D: de::Deserializer<'de>,9     fn deserialize<D>(deserializer: D) -> Result<Value, D::Error>
10     where
11         D: de::Deserializer<'de>,
12     {
13         struct ValueVisitor;
14 
15         impl<'de> de::Visitor<'de> for ValueVisitor {
16             type Value = Value;
17 
18             fn expecting(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
19                 fmt.write_str("any valid CBOR value")
20             }
21 
22             #[inline]
23             fn visit_str<E>(self, value: &str) -> Result<Value, E>
24             where
25                 E: de::Error,
26             {
27                 self.visit_string(String::from(value))
28             }
29 
30             #[inline]
31             fn visit_string<E>(self, value: String) -> Result<Value, E>
32             where
33                 E: de::Error,
34             {
35                 Ok(Value::Text(value))
36             }
37             #[inline]
38             fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
39             where
40                 E: de::Error,
41             {
42                 self.visit_byte_buf(v.to_owned())
43             }
44 
45             #[inline]
46             fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
47             where
48                 E: de::Error,
49             {
50                 Ok(Value::Bytes(v))
51             }
52 
53             #[inline]
54             fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
55             where
56                 E: de::Error,
57             {
58                 Ok(Value::Integer(v.into()))
59             }
60 
61             #[inline]
62             fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
63             where
64                 E: de::Error,
65             {
66                 Ok(Value::Integer(v.into()))
67             }
68 
69             #[inline]
70             fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
71             where
72                 E: de::Error,
73             {
74                 Ok(Value::Integer(v))
75             }
76 
77             #[inline]
78             fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
79             where
80                 E: de::Error,
81             {
82                 Ok(Value::Bool(v))
83             }
84 
85             #[inline]
86             fn visit_none<E>(self) -> Result<Self::Value, E>
87             where
88                 E: de::Error,
89             {
90                 self.visit_unit()
91             }
92 
93             #[inline]
94             fn visit_unit<E>(self) -> Result<Self::Value, E>
95             where
96                 E: de::Error,
97             {
98                 Ok(Value::Null)
99             }
100 
101             #[inline]
102             fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
103             where
104                 V: de::SeqAccess<'de>,
105             {
106                 let mut vec = Vec::new();
107 
108                 while let Some(elem) = visitor.next_element()? {
109                     vec.push(elem);
110                 }
111 
112                 Ok(Value::Array(vec))
113             }
114 
115             #[inline]
116             fn visit_map<V>(self, mut visitor: V) -> Result<Value, V::Error>
117             where
118                 V: de::MapAccess<'de>,
119             {
120                 let mut values = BTreeMap::new();
121 
122                 while let Some((key, value)) = visitor.next_entry()? {
123                     values.insert(key, value);
124                 }
125 
126                 Ok(Value::Map(values))
127             }
128 
129             #[inline]
130             fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
131             where
132                 E: de::Error,
133             {
134                 Ok(Value::Float(v))
135             }
136 
137             fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
138             where
139                 D: serde::Deserializer<'de>,
140             {
141                 let tag = crate::tags::get_tag();
142                 let inner = deserializer.deserialize_any(self);
143                 match tag {
144                     Some(tag) => inner.map(|v| Value::Tag(tag, Box::new(v))),
145                     None => inner,
146                 }
147             }
148         }
149 
150         deserializer.deserialize_any(ValueVisitor)
151     }
152 }
153 
154 /// Convert a `serde_cbor::Value` into a type `T`
155 #[allow(clippy::needless_pass_by_value)]
from_value<T>(value: Value) -> Result<T, crate::error::Error> where T: de::DeserializeOwned,156 pub fn from_value<T>(value: Value) -> Result<T, crate::error::Error>
157 where
158     T: de::DeserializeOwned,
159 {
160     // TODO implement in a way that doesn't require
161     // roundtrip through buffer (i.e. by implementing
162     // `serde::de::Deserializer` for `Value` and then doing
163     // `T::deserialize(value)`).
164     let buf = crate::to_vec(&value)?;
165     crate::from_slice(buf.as_slice())
166 }
167