1use crate::error::{DeserializeError, SerializeError};
2use crate::ids::{ChannelCookie, ObjectId, ServiceId};
3#[cfg(feature = "introspection")]
4use crate::introspection::{BuiltInType, Introspectable, Layout, LexicalId, References};
5use crate::value::{Bytes, ValueKind};
6use crate::value_deserializer::{Deserialize, Deserializer};
7use crate::value_serializer::{AsSerializeArg, Serialize, Serializer};
8use std::collections::{HashMap, HashSet};
9use uuid::Uuid;
10
11#[derive(Debug, Clone, PartialEq)]
14#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
15#[cfg_attr(
16 feature = "serde",
17 derive(serde::Serialize, serde::Deserialize),
18 serde(rename_all = "kebab-case")
19)]
20pub enum Value {
21 None,
22 Some(Box<Value>),
23 Bool(bool),
24 U8(u8),
25 I8(i8),
26 U16(u16),
27 I16(i16),
28 U32(u32),
29 I32(i32),
30 U64(u64),
31 I64(i64),
32 F32(f32),
33 F64(f64),
34 String(String),
35 Uuid(Uuid),
36 ObjectId(ObjectId),
37 ServiceId(ServiceId),
38 Vec(Vec<Value>),
39 Bytes(Bytes),
40 U8Map(HashMap<u8, Value>),
41 I8Map(HashMap<i8, Value>),
42 U16Map(HashMap<u16, Value>),
43 I16Map(HashMap<i16, Value>),
44 U32Map(HashMap<u32, Value>),
45 I32Map(HashMap<i32, Value>),
46 U64Map(HashMap<u64, Value>),
47 I64Map(HashMap<i64, Value>),
48 StringMap(HashMap<String, Value>),
49 UuidMap(HashMap<Uuid, Value>),
50 U8Set(HashSet<u8>),
51 I8Set(HashSet<i8>),
52 U16Set(HashSet<u16>),
53 I16Set(HashSet<i16>),
54 U32Set(HashSet<u32>),
55 I32Set(HashSet<i32>),
56 U64Set(HashSet<u64>),
57 I64Set(HashSet<i64>),
58 StringSet(HashSet<String>),
59 UuidSet(HashSet<Uuid>),
60 Struct(Struct),
61 Enum(Box<Enum>),
62 Sender(ChannelCookie),
63 Receiver(ChannelCookie),
64}
65
66impl Value {
67 pub fn is_none(&self) -> bool {
68 matches!(self, Self::None)
69 }
70
71 pub fn kind(&self) -> ValueKind {
72 match self {
73 Self::None => ValueKind::None,
74 Self::Some(_) => ValueKind::Some,
75 Self::Bool(_) => ValueKind::Bool,
76 Self::U8(_) => ValueKind::U8,
77 Self::I8(_) => ValueKind::I8,
78 Self::U16(_) => ValueKind::U16,
79 Self::I16(_) => ValueKind::I16,
80 Self::U32(_) => ValueKind::U32,
81 Self::I32(_) => ValueKind::I32,
82 Self::U64(_) => ValueKind::U64,
83 Self::I64(_) => ValueKind::I64,
84 Self::F32(_) => ValueKind::F32,
85 Self::F64(_) => ValueKind::F64,
86 Self::String(_) => ValueKind::String,
87 Self::Uuid(_) => ValueKind::Uuid,
88 Self::ObjectId(_) => ValueKind::ObjectId,
89 Self::ServiceId(_) => ValueKind::ServiceId,
90 Self::Vec(_) => ValueKind::Vec,
91 Self::Bytes(_) => ValueKind::Bytes,
92 Self::U8Map(_) => ValueKind::U8Map,
93 Self::I8Map(_) => ValueKind::I8Map,
94 Self::U16Map(_) => ValueKind::U16Map,
95 Self::I16Map(_) => ValueKind::I16Map,
96 Self::U32Map(_) => ValueKind::U32Map,
97 Self::I32Map(_) => ValueKind::I32Map,
98 Self::U64Map(_) => ValueKind::U64Map,
99 Self::I64Map(_) => ValueKind::I64Map,
100 Self::StringMap(_) => ValueKind::StringMap,
101 Self::UuidMap(_) => ValueKind::UuidMap,
102 Self::U8Set(_) => ValueKind::U8Set,
103 Self::I8Set(_) => ValueKind::I8Set,
104 Self::U16Set(_) => ValueKind::U16Set,
105 Self::I16Set(_) => ValueKind::I16Set,
106 Self::U32Set(_) => ValueKind::U32Set,
107 Self::I32Set(_) => ValueKind::I32Set,
108 Self::U64Set(_) => ValueKind::U64Set,
109 Self::I64Set(_) => ValueKind::I64Set,
110 Self::StringSet(_) => ValueKind::StringSet,
111 Self::UuidSet(_) => ValueKind::UuidSet,
112 Self::Struct(_) => ValueKind::Struct,
113 Self::Enum(_) => ValueKind::Enum,
114 Self::Sender(_) => ValueKind::Sender,
115 Self::Receiver(_) => ValueKind::Receiver,
116 }
117 }
118}
119
120impl Serialize for Value {
121 fn serialize(&self, serializer: Serializer) -> Result<(), SerializeError> {
122 match self {
123 Self::None => serializer.serialize_none(),
124 Self::Some(value) => serializer.serialize_some(value)?,
125 Self::Bool(value) => serializer.serialize(value)?,
126 Self::U8(value) => serializer.serialize(value)?,
127 Self::I8(value) => serializer.serialize(value)?,
128 Self::U16(value) => serializer.serialize(value)?,
129 Self::I16(value) => serializer.serialize(value)?,
130 Self::U32(value) => serializer.serialize(value)?,
131 Self::I32(value) => serializer.serialize(value)?,
132 Self::U64(value) => serializer.serialize(value)?,
133 Self::I64(value) => serializer.serialize(value)?,
134 Self::F32(value) => serializer.serialize(value)?,
135 Self::F64(value) => serializer.serialize(value)?,
136 Self::String(value) => serializer.serialize(value)?,
137 Self::Uuid(value) => serializer.serialize(value)?,
138 Self::ObjectId(value) => serializer.serialize(value)?,
139 Self::ServiceId(value) => serializer.serialize(value)?,
140 Self::Vec(value) => serializer.serialize(value)?,
141 Self::Bytes(value) => serializer.serialize(value)?,
142 Self::U8Map(value) => serializer.serialize(value)?,
143 Self::I8Map(value) => serializer.serialize(value)?,
144 Self::U16Map(value) => serializer.serialize(value)?,
145 Self::I16Map(value) => serializer.serialize(value)?,
146 Self::U32Map(value) => serializer.serialize(value)?,
147 Self::I32Map(value) => serializer.serialize(value)?,
148 Self::U64Map(value) => serializer.serialize(value)?,
149 Self::I64Map(value) => serializer.serialize(value)?,
150 Self::StringMap(value) => serializer.serialize(value)?,
151 Self::UuidMap(value) => serializer.serialize(value)?,
152 Self::U8Set(value) => serializer.serialize(value)?,
153 Self::I8Set(value) => serializer.serialize(value)?,
154 Self::U16Set(value) => serializer.serialize(value)?,
155 Self::I16Set(value) => serializer.serialize(value)?,
156 Self::U32Set(value) => serializer.serialize(value)?,
157 Self::I32Set(value) => serializer.serialize(value)?,
158 Self::U64Set(value) => serializer.serialize(value)?,
159 Self::I64Set(value) => serializer.serialize(value)?,
160 Self::StringSet(value) => serializer.serialize(value)?,
161 Self::UuidSet(value) => serializer.serialize(value)?,
162 Self::Struct(value) => serializer.serialize(value)?,
163 Self::Enum(value) => serializer.serialize(value)?,
164 Self::Sender(value) => serializer.serialize_sender(*value),
165 Self::Receiver(value) => serializer.serialize_receiver(*value),
166 }
167
168 Ok(())
169 }
170}
171
172impl Deserialize for Value {
173 fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
174 match deserializer.peek_value_kind()? {
175 ValueKind::None => deserializer.deserialize_none().map(|()| Self::None),
176 ValueKind::Some => deserializer.deserialize_some().map(Self::Some),
177 ValueKind::Bool => deserializer.deserialize().map(Self::Bool),
178 ValueKind::U8 => deserializer.deserialize().map(Self::U8),
179 ValueKind::I8 => deserializer.deserialize().map(Self::I8),
180 ValueKind::U16 => deserializer.deserialize().map(Self::U16),
181 ValueKind::I16 => deserializer.deserialize().map(Self::I16),
182 ValueKind::U32 => deserializer.deserialize().map(Self::U32),
183 ValueKind::I32 => deserializer.deserialize().map(Self::I32),
184 ValueKind::U64 => deserializer.deserialize().map(Self::U64),
185 ValueKind::I64 => deserializer.deserialize().map(Self::I64),
186 ValueKind::F32 => deserializer.deserialize().map(Self::F32),
187 ValueKind::F64 => deserializer.deserialize().map(Self::F64),
188 ValueKind::String => deserializer.deserialize().map(Self::String),
189 ValueKind::Uuid => deserializer.deserialize().map(Self::Uuid),
190 ValueKind::ObjectId => deserializer.deserialize().map(Self::ObjectId),
191 ValueKind::ServiceId => deserializer.deserialize().map(Self::ServiceId),
192 ValueKind::Vec => deserializer.deserialize().map(Self::Vec),
193 ValueKind::Bytes => deserializer.deserialize().map(Self::Bytes),
194 ValueKind::U8Map => deserializer.deserialize().map(Self::U8Map),
195 ValueKind::I8Map => deserializer.deserialize().map(Self::I8Map),
196 ValueKind::U16Map => deserializer.deserialize().map(Self::U16Map),
197 ValueKind::I16Map => deserializer.deserialize().map(Self::I16Map),
198 ValueKind::U32Map => deserializer.deserialize().map(Self::U32Map),
199 ValueKind::I32Map => deserializer.deserialize().map(Self::I32Map),
200 ValueKind::U64Map => deserializer.deserialize().map(Self::U64Map),
201 ValueKind::I64Map => deserializer.deserialize().map(Self::I64Map),
202 ValueKind::StringMap => deserializer.deserialize().map(Self::StringMap),
203 ValueKind::UuidMap => deserializer.deserialize().map(Self::UuidMap),
204 ValueKind::U8Set => deserializer.deserialize().map(Self::U8Set),
205 ValueKind::I8Set => deserializer.deserialize().map(Self::I8Set),
206 ValueKind::U16Set => deserializer.deserialize().map(Self::U16Set),
207 ValueKind::I16Set => deserializer.deserialize().map(Self::I16Set),
208 ValueKind::U32Set => deserializer.deserialize().map(Self::U32Set),
209 ValueKind::I32Set => deserializer.deserialize().map(Self::I32Set),
210 ValueKind::U64Set => deserializer.deserialize().map(Self::U64Set),
211 ValueKind::I64Set => deserializer.deserialize().map(Self::I64Set),
212 ValueKind::StringSet => deserializer.deserialize().map(Self::StringSet),
213 ValueKind::UuidSet => deserializer.deserialize().map(Self::UuidSet),
214 ValueKind::Struct => deserializer.deserialize().map(Self::Struct),
215 ValueKind::Enum => deserializer.deserialize().map(Self::Enum),
216 ValueKind::Sender => deserializer.deserialize_sender().map(Self::Sender),
217 ValueKind::Receiver => deserializer.deserialize_receiver().map(Self::Receiver),
218 }
219 }
220}
221
222impl AsSerializeArg for Value {
223 type SerializeArg<'a> = &'a Self;
224
225 fn as_serialize_arg<'a>(&'a self) -> Self::SerializeArg<'a>
226 where
227 Self: 'a,
228 {
229 self
230 }
231}
232
233#[cfg(feature = "introspection")]
234impl Introspectable for Value {
235 fn layout() -> Layout {
236 BuiltInType::Value.into()
237 }
238
239 fn lexical_id() -> LexicalId {
240 LexicalId::VALUE
241 }
242
243 fn add_references(_references: &mut References) {}
244}
245
246#[derive(Debug, Clone, PartialEq)]
247#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
248#[cfg_attr(
249 feature = "serde",
250 derive(serde::Serialize, serde::Deserialize),
251 serde(transparent)
252)]
253pub struct Struct(pub HashMap<u32, Value>);
254
255impl Serialize for Struct {
256 fn serialize(&self, serializer: Serializer) -> Result<(), SerializeError> {
257 let mut serializer = serializer.serialize_struct(self.0.len())?;
258
259 for (&id, field) in &self.0 {
260 serializer.serialize_field(id, field)?;
261 }
262
263 serializer.finish()
264 }
265}
266
267impl Deserialize for Struct {
268 fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
269 let mut deserializer = deserializer.deserialize_struct()?;
270
271 let mut value = HashMap::new();
272 while deserializer.has_more_fields() {
273 let deserializer = deserializer.deserialize_field()?;
274 let id = deserializer.id();
275 let field = deserializer.deserialize()?;
276 value.insert(id, field);
277 }
278
279 deserializer.finish(Self(value))
280 }
281}
282
283impl AsSerializeArg for Struct {
284 type SerializeArg<'a> = &'a Self;
285
286 fn as_serialize_arg<'a>(&'a self) -> Self::SerializeArg<'a>
287 where
288 Self: 'a,
289 {
290 self
291 }
292}
293
294#[derive(Debug, Clone, PartialEq)]
295#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
296#[cfg_attr(
297 feature = "serde",
298 derive(serde::Serialize, serde::Deserialize),
299 serde(rename_all = "kebab-case")
300)]
301pub struct Enum {
302 pub variant: u32,
303 pub value: Value,
304}
305
306impl Enum {
307 pub fn new(variant: u32, value: Value) -> Self {
308 Self { variant, value }
309 }
310}
311
312impl Serialize for Enum {
313 fn serialize(&self, serializer: Serializer) -> Result<(), SerializeError> {
314 serializer.serialize_enum(self.variant, &self.value)
315 }
316}
317
318impl Deserialize for Enum {
319 fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
320 let deserializer = deserializer.deserialize_enum()?;
321 let variant = deserializer.variant();
322 let value = deserializer.deserialize()?;
323 Ok(Self::new(variant, value))
324 }
325}
326
327impl AsSerializeArg for Enum {
328 type SerializeArg<'a> = &'a Self;
329
330 fn as_serialize_arg<'a>(&'a self) -> Self::SerializeArg<'a>
331 where
332 Self: 'a,
333 {
334 self
335 }
336}