1use std::any::Any;
14use std::fmt;
15use std::sync::Arc;
16
17#[derive(Clone)]
22pub enum Value {
23 Null,
25 Number(f64),
27 Text(Arc<str>),
29 Bytes(Arc<Vec<u8>>),
31 List(Arc<Vec<Value>>),
33 Opaque(Arc<dyn Any + Send + Sync>),
40 Map(Arc<Vec<(String, Value)>>),
46}
47
48impl Value {
49 pub fn number(x: f64) -> Self {
51 Self::Number(x)
52 }
53
54 pub fn text(s: impl AsRef<str>) -> Self {
56 Self::Text(Arc::from(s.as_ref()))
57 }
58
59 pub fn list(values: impl Into<Vec<Value>>) -> Self {
61 Self::List(Arc::new(values.into()))
62 }
63
64 pub fn map(pairs: impl Into<Vec<(String, Value)>>) -> Self {
66 Self::Map(Arc::new(pairs.into()))
67 }
68
69 pub fn get(&self, key: &str) -> Option<&Value> {
71 let Self::Map(pairs) = self else {
72 return None;
73 };
74 pairs.iter().find(|(k, _)| k == key).map(|(_, v)| v)
75 }
76
77 pub fn values(&self) -> Option<Vec<&Value>> {
79 let Self::Map(pairs) = self else {
80 return None;
81 };
82 Some(pairs.iter().map(|(_, v)| v).collect())
83 }
84
85 pub fn opaque(x: impl Any + Send + Sync) -> Self {
87 Self::Opaque(Arc::new(x))
88 }
89
90 pub fn downcast<T: Any + Send + Sync>(&self) -> Option<&T> {
92 let Self::Opaque(inner) = self else {
93 return None;
94 };
95 inner.downcast_ref::<T>()
96 }
97
98 pub fn travels(&self) -> bool {
104 match self {
105 Self::Opaque(_) => false,
106 Self::List(items) => items.iter().all(Self::travels),
107 Self::Map(pairs) => pairs.iter().all(|(_, value)| value.travels()),
108 Self::Null | Self::Number(_) | Self::Text(_) | Self::Bytes(_) => true,
109 }
110 }
111
112 pub fn type_name(&self) -> &'static str {
114 match self {
115 Self::Null => "null",
116 Self::Number(_) => "number",
117 Self::Text(_) => "text",
118 Self::Bytes(_) => "bytes",
119 Self::List(_) => "list",
120 Self::Map(_) => "map",
121 Self::Opaque(_) => "opaque",
122 }
123 }
124}
125
126impl PartialEq for Value {
127 fn eq(&self, other: &Self) -> bool {
130 match (self, other) {
131 (Self::Null, Self::Null) => true,
132 (Self::Number(a), Self::Number(b)) => a == b,
133 (Self::Text(a), Self::Text(b)) => a == b,
134 (Self::Bytes(a), Self::Bytes(b)) => a == b,
135 (Self::List(a), Self::List(b)) => a == b,
136 (Self::Map(a), Self::Map(b)) => a == b,
137 (Self::Opaque(a), Self::Opaque(b)) => Arc::ptr_eq(a, b),
138 _ => false,
139 }
140 }
141}
142
143impl fmt::Debug for Value {
144 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
145 match self {
146 Self::Null => f.write_str("Null"),
147 Self::Number(x) => write!(f, "Number({x})"),
148 Self::Text(s) => write!(f, "Text({s:?})"),
149 Self::Bytes(b) => write!(f, "Bytes({} bytes)", b.len()),
150 Self::List(items) => f.debug_tuple("List").field(items).finish(),
151 Self::Map(pairs) => f.debug_tuple("Map").field(pairs).finish(),
152 Self::Opaque(_) => f.write_str("Opaque(..)"),
153 }
154 }
155}
156
157impl From<&str> for Value {
158 fn from(s: &str) -> Self {
159 Self::text(s)
160 }
161}
162
163impl From<f64> for Value {
164 fn from(x: f64) -> Self {
165 Self::Number(x)
166 }
167}
168
169#[cfg(feature = "serde")]
176mod shadow {
177 use super::Value;
178 use serde::{Deserialize, Deserializer, Serialize, Serializer};
179 use std::borrow::Cow;
180 use std::sync::Arc;
181
182 #[derive(Serialize, Deserialize)]
183 pub(super) enum Shadow<'a> {
184 Null,
185 Number(f64),
186 Text(Cow<'a, str>),
187 Bytes(#[serde(with = "as_bytes")] Cow<'a, [u8]>),
188 List(Vec<Shadow<'a>>),
189 Map(Vec<(Cow<'a, str>, Shadow<'a>)>),
190 }
191
192 mod as_bytes {
203 use super::{Cow, Deserializer, Serializer};
204 use serde::de::{Error, SeqAccess, Visitor};
205 use std::fmt;
206
207 pub fn serialize<S: Serializer>(bytes: &[u8], s: S) -> Result<S::Ok, S::Error> {
208 s.serialize_bytes(bytes)
209 }
210
211 pub fn deserialize<'de, 'a, D: Deserializer<'de>>(d: D) -> Result<Cow<'a, [u8]>, D::Error> {
212 d.deserialize_byte_buf(Bytes).map(Cow::Owned)
213 }
214
215 struct Bytes;
216
217 impl<'de> Visitor<'de> for Bytes {
218 type Value = Vec<u8>;
219
220 fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
221 f.write_str("bytes")
222 }
223
224 fn visit_bytes<E: Error>(self, bytes: &[u8]) -> Result<Self::Value, E> {
225 Ok(bytes.to_vec())
226 }
227
228 fn visit_byte_buf<E: Error>(self, bytes: Vec<u8>) -> Result<Self::Value, E> {
229 Ok(bytes)
230 }
231
232 fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
234 let mut bytes = Vec::with_capacity(seq.size_hint().unwrap_or(0));
235 while let Some(byte) = seq.next_element()? {
236 bytes.push(byte);
237 }
238 Ok(bytes)
239 }
240 }
241 }
242
243 pub(super) struct Opaque;
245
246 impl<'a> TryFrom<&'a Value> for Shadow<'a> {
247 type Error = Opaque;
248
249 fn try_from(value: &'a Value) -> Result<Self, Opaque> {
250 Ok(match value {
251 Value::Null => Shadow::Null,
252 Value::Number(x) => Shadow::Number(*x),
253 Value::Text(s) => Shadow::Text(Cow::Borrowed(s)),
254 Value::Bytes(bytes) => Shadow::Bytes(Cow::Borrowed(bytes)),
255 Value::List(items) => Shadow::List(
256 items
257 .iter()
258 .map(Shadow::try_from)
259 .collect::<Result<_, _>>()?,
260 ),
261 Value::Map(pairs) => Shadow::Map(
262 pairs
263 .iter()
264 .map(|(key, value)| Ok((Cow::Borrowed(key.as_str()), value.try_into()?)))
265 .collect::<Result<_, Opaque>>()?,
266 ),
267 Value::Opaque(_) => return Err(Opaque),
268 })
269 }
270 }
271
272 impl From<Shadow<'_>> for Value {
273 fn from(shadow: Shadow<'_>) -> Self {
274 match shadow {
275 Shadow::Null => Value::Null,
276 Shadow::Number(x) => Value::Number(x),
277 Shadow::Text(s) => Value::text(s),
278 Shadow::Bytes(bytes) => Value::Bytes(Arc::new(bytes.into_owned())),
279 Shadow::List(items) => {
280 Value::list(items.into_iter().map(Value::from).collect::<Vec<_>>())
281 }
282 Shadow::Map(pairs) => Value::map(
283 pairs
284 .into_iter()
285 .map(|(key, value)| (key.into_owned(), value.into()))
286 .collect::<Vec<_>>(),
287 ),
288 }
289 }
290 }
291
292 impl Serialize for Value {
293 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
297 Shadow::try_from(self)
298 .map_err(|Opaque| {
299 serde::ser::Error::custom(
300 "an opaque value does not leave this process: what it carries \
301 only exists here",
302 )
303 })?
304 .serialize(serializer)
305 }
306 }
307
308 impl<'de> Deserialize<'de> for Value {
309 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
310 Shadow::deserialize(deserializer).map(Value::from)
311 }
312 }
313}