1use alloc::borrow::ToOwned;
2use alloc::boxed::Box;
3use alloc::collections::BTreeMap;
4use alloc::string::String;
5use alloc::vec::Vec;
6use core::any::Any;
7use core::cmp::Ordering;
8use core::fmt;
9use core::hash::Hash;
10use core::hash::Hasher;
11
12use tiny_ordered_float::{OrderedF32, OrderedF64};
13
14use crate::enum_::EnumValue;
15use crate::struct_::StructValue;
16use crate::tuple::TupleValue;
17use crate::tuple_struct::TupleStructValue;
18use crate::type_info::graph::NodeId;
19use crate::type_info::graph::OpaqueNode;
20use crate::type_info::graph::TypeGraph;
21use crate::DescribeType;
22use crate::FromReflect;
23use crate::Reflect;
24use crate::ReflectMut;
25use crate::ReflectOwned;
26use crate::ReflectRef;
27use crate::ScalarMut;
28use crate::ScalarOwned;
29use crate::ScalarRef;
30use crate::TypeDescriptor;
31
32#[allow(non_camel_case_types)]
36#[derive(Debug, Clone)]
37#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
38#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
39pub enum Value {
40 usize(usize),
41 u8(u8),
42 u16(u16),
43 u32(u32),
44 u64(u64),
45 u128(u128),
46 i8(i8),
47 i16(i16),
48 i32(i32),
49 i64(i64),
50 i128(i128),
51 bool(bool),
52 char(char),
53 f32(f32),
54 f64(f64),
55 String(String),
56 StructValue(Box<StructValue>),
57 EnumValue(Box<EnumValue>),
58 TupleStructValue(TupleStructValue),
59 TupleValue(TupleValue),
60 List(Vec<Value>),
61 Map(BTreeMap<Value, Value>),
62}
63
64impl FromReflect for Value {
65 fn from_reflect(reflect: &dyn Reflect) -> Option<Self> {
66 Some(reflect.to_value())
67 }
68}
69
70#[allow(non_camel_case_types)]
71#[derive(Eq, PartialEq, PartialOrd, Ord, Hash)]
72enum OrdEqHashValue<'a> {
73 usize(usize),
74 u8(u8),
75 u16(u16),
76 u32(u32),
77 u64(u64),
78 u128(u128),
79 i8(i8),
80 i16(i16),
81 i32(i32),
82 i64(i64),
83 i128(i128),
84 bool(bool),
85 char(char),
86 f32(OrderedF32),
87 f64(OrderedF64),
88 String(&'a str),
89 StructValue(&'a StructValue),
90 EnumValue(&'a EnumValue),
91 TupleStructValue(&'a TupleStructValue),
92 TupleValue(&'a TupleValue),
93 List(&'a [Value]),
94 Map(&'a BTreeMap<Value, Value>),
95}
96
97impl<'a> From<&'a Value> for OrdEqHashValue<'a> {
98 fn from(value: &'a Value) -> Self {
99 match value {
100 Value::usize(inner) => OrdEqHashValue::usize(*inner),
101 Value::u8(inner) => OrdEqHashValue::u8(*inner),
102 Value::u16(inner) => OrdEqHashValue::u16(*inner),
103 Value::u32(inner) => OrdEqHashValue::u32(*inner),
104 Value::u64(inner) => OrdEqHashValue::u64(*inner),
105 Value::u128(inner) => OrdEqHashValue::u128(*inner),
106 Value::i8(inner) => OrdEqHashValue::i8(*inner),
107 Value::i16(inner) => OrdEqHashValue::i16(*inner),
108 Value::i32(inner) => OrdEqHashValue::i32(*inner),
109 Value::i64(inner) => OrdEqHashValue::i64(*inner),
110 Value::i128(inner) => OrdEqHashValue::i128(*inner),
111 Value::bool(inner) => OrdEqHashValue::bool(*inner),
112 Value::char(inner) => OrdEqHashValue::char(*inner),
113 Value::f32(inner) => OrdEqHashValue::f32(OrderedF32(*inner)),
114 Value::f64(inner) => OrdEqHashValue::f64(OrderedF64(*inner)),
115 Value::String(inner) => OrdEqHashValue::String(inner),
116 Value::StructValue(inner) => OrdEqHashValue::StructValue(inner),
117 Value::EnumValue(inner) => OrdEqHashValue::EnumValue(inner),
118 Value::TupleStructValue(inner) => OrdEqHashValue::TupleStructValue(inner),
119 Value::TupleValue(inner) => OrdEqHashValue::TupleValue(inner),
120 Value::List(inner) => OrdEqHashValue::List(inner),
121 Value::Map(inner) => OrdEqHashValue::Map(inner),
122 }
123 }
124}
125
126impl PartialEq for Value {
127 fn eq(&self, other: &Self) -> bool {
128 OrdEqHashValue::from(self) == OrdEqHashValue::from(other)
129 }
130}
131
132impl Eq for Value {}
133
134impl PartialOrd for Value {
135 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
136 Some(self.cmp(other))
137 }
138}
139
140impl Ord for Value {
141 fn cmp(&self, other: &Self) -> Ordering {
142 OrdEqHashValue::from(self).cmp(&OrdEqHashValue::from(other))
143 }
144}
145
146impl Hash for Value {
147 fn hash<H>(&self, state: &mut H)
148 where
149 H: Hasher,
150 {
151 OrdEqHashValue::from(self).hash(state);
152 }
153}
154
155macro_rules! for_each_variant {
156 ($self:expr, $inner:ident => $expr:expr) => {
157 match $self {
158 Value::usize($inner) => $expr,
159 Value::u8($inner) => $expr,
160 Value::u16($inner) => $expr,
161 Value::u32($inner) => $expr,
162 Value::u64($inner) => $expr,
163 Value::u128($inner) => $expr,
164 Value::i8($inner) => $expr,
165 Value::i16($inner) => $expr,
166 Value::i32($inner) => $expr,
167 Value::i64($inner) => $expr,
168 Value::i128($inner) => $expr,
169 Value::bool($inner) => $expr,
170 Value::char($inner) => $expr,
171 Value::f32($inner) => $expr,
172 Value::f64($inner) => $expr,
173 Value::String($inner) => $expr,
174 Value::StructValue($inner) => $expr,
175 Value::TupleStructValue($inner) => $expr,
176 Value::EnumValue($inner) => $expr,
177 Value::TupleValue($inner) => $expr,
178 Value::List($inner) => $expr,
179 Value::Map($inner) => $expr,
180 }
181 };
182}
183
184impl DescribeType for Value {
185 fn build(graph: &mut TypeGraph) -> NodeId {
186 graph.get_or_build_node_with::<Self, _>(|graph| {
187 OpaqueNode::new::<Self>(Default::default(), graph)
188 })
189 }
190}
191
192impl Reflect for Value {
193 fn type_descriptor(&self) -> alloc::borrow::Cow<'static, TypeDescriptor> {
194 <Self as DescribeType>::type_descriptor()
195 }
196
197 fn as_any(&self) -> &dyn Any {
198 for_each_variant!(self, inner => inner)
199 }
200
201 fn as_any_mut(&mut self) -> &mut dyn Any {
202 for_each_variant!(self, inner => inner)
203 }
204
205 fn as_reflect(&self) -> &dyn Reflect {
206 for_each_variant!(self, inner => inner)
207 }
208
209 fn as_reflect_mut(&mut self) -> &mut dyn Reflect {
210 for_each_variant!(self, inner => inner)
211 }
212
213 fn reflect_owned(self: Box<Self>) -> ReflectOwned {
214 match *self {
215 Value::usize(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
216 Value::u8(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
217 Value::u16(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
218 Value::u32(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
219 Value::u64(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
220 Value::u128(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
221 Value::i8(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
222 Value::i16(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
223 Value::i32(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
224 Value::i64(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
225 Value::i128(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
226 Value::bool(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
227 Value::char(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
228 Value::f32(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
229 Value::f64(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
230 Value::String(inner) => ReflectOwned::Scalar(ScalarOwned::from(inner)),
231 Value::StructValue(inner) => ReflectOwned::Struct(inner),
232 Value::EnumValue(inner) => ReflectOwned::Enum(inner),
233 Value::TupleStructValue(inner) => ReflectOwned::TupleStruct(Box::new(inner)),
234 Value::TupleValue(inner) => ReflectOwned::Tuple(Box::new(inner)),
235 Value::List(inner) => ReflectOwned::List(Box::new(inner)),
236 Value::Map(inner) => ReflectOwned::Map(Box::new(inner)),
237 }
238 }
239
240 fn reflect_ref(&self) -> ReflectRef<'_> {
241 match self {
242 Value::usize(inner) => ReflectRef::Scalar(ScalarRef::from(*inner)),
243 Value::u8(inner) => ReflectRef::Scalar(ScalarRef::from(*inner)),
244 Value::u16(inner) => ReflectRef::Scalar(ScalarRef::from(*inner)),
245 Value::u32(inner) => ReflectRef::Scalar(ScalarRef::from(*inner)),
246 Value::u64(inner) => ReflectRef::Scalar(ScalarRef::from(*inner)),
247 Value::u128(inner) => ReflectRef::Scalar(ScalarRef::from(*inner)),
248 Value::i8(inner) => ReflectRef::Scalar(ScalarRef::from(*inner)),
249 Value::i16(inner) => ReflectRef::Scalar(ScalarRef::from(*inner)),
250 Value::i32(inner) => ReflectRef::Scalar(ScalarRef::from(*inner)),
251 Value::i64(inner) => ReflectRef::Scalar(ScalarRef::from(*inner)),
252 Value::i128(inner) => ReflectRef::Scalar(ScalarRef::from(*inner)),
253 Value::bool(inner) => ReflectRef::Scalar(ScalarRef::from(*inner)),
254 Value::char(inner) => ReflectRef::Scalar(ScalarRef::from(*inner)),
255 Value::f32(inner) => ReflectRef::Scalar(ScalarRef::from(*inner)),
256 Value::f64(inner) => ReflectRef::Scalar(ScalarRef::from(*inner)),
257 Value::String(inner) => ReflectRef::Scalar(ScalarRef::from(inner)),
258 Value::StructValue(inner) => ReflectRef::Struct(&**inner),
259 Value::EnumValue(inner) => ReflectRef::Enum(&**inner),
260 Value::TupleStructValue(inner) => ReflectRef::TupleStruct(inner),
261 Value::TupleValue(inner) => ReflectRef::Tuple(inner),
262 Value::List(inner) => ReflectRef::List(inner),
263 Value::Map(inner) => ReflectRef::Map(inner),
264 }
265 }
266
267 fn reflect_mut(&mut self) -> ReflectMut<'_> {
268 match self {
269 Value::usize(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
270 Value::u8(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
271 Value::u16(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
272 Value::u32(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
273 Value::u64(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
274 Value::u128(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
275 Value::i8(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
276 Value::i16(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
277 Value::i32(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
278 Value::i64(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
279 Value::i128(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
280 Value::bool(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
281 Value::char(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
282 Value::f32(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
283 Value::f64(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
284 Value::String(inner) => ReflectMut::Scalar(ScalarMut::from(inner)),
285 Value::StructValue(inner) => ReflectMut::Struct(&mut **inner),
286 Value::EnumValue(inner) => ReflectMut::Enum(&mut **inner),
287 Value::TupleStructValue(inner) => ReflectMut::TupleStruct(inner),
288 Value::TupleValue(inner) => ReflectMut::Tuple(inner),
289 Value::List(inner) => ReflectMut::List(inner),
290 Value::Map(inner) => ReflectMut::Map(inner),
291 }
292 }
293
294 fn patch(&mut self, value: &dyn Reflect) {
295 for_each_variant!(self, inner => inner.patch(value))
296 }
297
298 fn to_value(&self) -> Value {
299 self.clone()
300 }
301
302 fn clone_reflect(&self) -> Box<dyn Reflect> {
303 Box::new(self.clone())
304 }
305
306 fn debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
307 if f.alternate() {
308 write!(f, "{self:#?}")
309 } else {
310 write!(f, "{self:?}")
311 }
312 }
313}
314
315macro_rules! from_impls {
316 (
317 $($ident:ident)*
318 ) => {
319 $(
320 impl From<$ident> for Value {
321 fn from(value: $ident) -> Self {
322 Value::$ident(value)
323 }
324 }
325 )*
326 };
327}
328
329impl From<StructValue> for Value {
330 fn from(value: StructValue) -> Self {
331 Value::StructValue(Box::new(value))
332 }
333}
334
335impl From<EnumValue> for Value {
336 fn from(value: EnumValue) -> Self {
337 Value::EnumValue(Box::new(value))
338 }
339}
340
341impl From<&str> for Value {
342 fn from(value: &str) -> Self {
343 value.to_owned().into()
344 }
345}
346
347impl From<&dyn Reflect> for Value {
348 fn from(reflect: &dyn Reflect) -> Self {
349 reflect.to_value()
350 }
351}
352
353from_impls! {
354 usize u8 u16 u32 u64 u128
355 i8 i16 i32 i64 i128
356 f32 f64
357 bool char String
358 TupleValue TupleStructValue
359}