1use std::cmp::{Eq, PartialEq};
6use std::fmt;
7
8use bstr::BString;
9use indexmap::IndexMap;
10use serde::de;
11
12use super::Double;
13
14#[derive(Debug, Clone, PartialEq, Eq)]
21pub enum Value {
22 Null,
24 Blob(BString),
27 Boolean(bool),
29 Number(i128),
33 Double(Double),
35 Array(Vec<Value>),
37 Map(IndexMap<BString, Value>),
40}
41
42impl Default for Value {
43 fn default() -> Self {
44 Value::Null
45 }
46}
47
48impl<'de> de::Deserialize<'de> for Value {
49 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
50 where
51 D: serde::Deserializer<'de>,
52 {
53 struct Visitor;
54
55 impl<'de> de::Visitor<'de> for Visitor {
56 type Value = Value;
57
58 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
59 f.write_str("any valid RESP3 value")
60 }
61
62 fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
63 where
64 E: de::Error,
65 {
66 Ok(Value::Boolean(v))
67 }
68
69 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
70 where
71 E: de::Error,
72 {
73 Ok(Value::Number(v.into()))
74 }
75
76 fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
77 where
78 E: de::Error,
79 {
80 Ok(Value::Number(v))
81 }
82
83 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
84 where
85 E: de::Error,
86 {
87 Ok(Value::Number(v.into()))
88 }
89
90 fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
91 where
92 E: de::Error,
93 {
94 Ok(Value::Number(v.try_into().map_err(|_| {
95 E::custom("number cannot be represented within the i128 range")
96 })?))
97 }
98
99 fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
100 where
101 E: de::Error,
102 {
103 if v.is_nan() {
104 return Err(E::custom("NaN is not allowed"));
105 }
106
107 Ok(Value::Double(Double::new(v)))
108 }
109
110 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
111 where
112 E: de::Error,
113 {
114 Ok(Value::Blob(v.into()))
115 }
116
117 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
118 where
119 E: de::Error,
120 {
121 Ok(Value::Blob(v.into()))
122 }
123
124 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
125 where
126 E: de::Error,
127 {
128 Ok(Value::Blob(v.into()))
129 }
130
131 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
132 where
133 E: de::Error,
134 {
135 Ok(Value::Blob(v.into()))
136 }
137
138 fn visit_unit<E>(self) -> Result<Self::Value, E>
139 where
140 E: de::Error,
141 {
142 Ok(Value::Null)
143 }
144
145 fn visit_none<E>(self) -> Result<Self::Value, E>
146 where
147 E: de::Error,
148 {
149 Ok(Value::Null)
150 }
151
152 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
153 where
154 D: serde::Deserializer<'de>,
155 {
156 de::Deserialize::deserialize(deserializer)
157 }
158
159 fn visit_seq<A>(self, mut access: A) -> Result<Self::Value, A::Error>
160 where
161 A: de::SeqAccess<'de>,
162 {
163 let mut vec = Vec::new();
164
165 while let Some(elem) = access.next_element()? {
166 vec.push(elem);
167 }
168
169 Ok(Value::Array(vec))
170 }
171
172 fn visit_map<A>(self, mut access: A) -> Result<Self::Value, A::Error>
173 where
174 A: de::MapAccess<'de>,
175 {
176 let mut map = IndexMap::new();
177
178 while let Some((key, value)) = access.next_entry()? {
179 map.insert(key, value);
180 }
181
182 Ok(Value::Map(map))
183 }
184 }
185
186 deserializer.deserialize_any(Visitor)
187 }
188}