1
//! Value module.
2

            
3
use alloc::{borrow::Cow, boxed::Box, format, string::String, vec::Vec};
4
use core::{cmp::Eq, hash::Hash};
5

            
6
use serde::{
7
    de::{DeserializeOwned, DeserializeSeed, Deserializer, MapAccess, SeqAccess, Visitor},
8
    forward_to_deserialize_any,
9
};
10

            
11
use crate::{de::Error, error::Result};
12

            
13
mod map;
14
mod number;
15
pub(crate) mod raw;
16

            
17
pub use map::Map;
18
pub use number::{Number, F32, F64};
19
#[allow(clippy::useless_attribute, clippy::module_name_repetitions)]
20
pub use raw::RawValue;
21

            
22
#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
23
pub enum Value {
24
    Bool(bool),
25
    Char(char),
26
    Map(Map),
27
    Number(Number),
28
    Option(Option<Box<Value>>),
29
    String(String),
30
    Bytes(Vec<u8>),
31
    Seq(Vec<Value>),
32
    Unit,
33
}
34

            
35
impl From<bool> for Value {
36
12
    fn from(value: bool) -> Self {
37
12
        Self::Bool(value)
38
12
    }
39
}
40

            
41
impl From<char> for Value {
42
8
    fn from(value: char) -> Self {
43
8
        Self::Char(value)
44
8
    }
45
}
46

            
47
impl<K: Into<Value>, V: Into<Value>> FromIterator<(K, V)> for Value {
48
4
    fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
49
4
        Self::Map(iter.into_iter().collect())
50
4
    }
51
}
52

            
53
impl From<Map> for Value {
54
4
    fn from(value: Map) -> Self {
55
4
        Self::Map(value)
56
4
    }
57
}
58

            
59
impl<T: Into<Number>> From<T> for Value {
60
228
    fn from(value: T) -> Self {
61
228
        Self::Number(value.into())
62
228
    }
63
}
64

            
65
impl<T: Into<Value>> From<Option<T>> for Value {
66
16
    fn from(value: Option<T>) -> Self {
67
16
        Self::Option(value.map(Into::into).map(Box::new))
68
16
    }
69
}
70

            
71
impl<'a> From<&'a str> for Value {
72
132
    fn from(value: &'a str) -> Self {
73
132
        String::from(value).into()
74
132
    }
75
}
76

            
77
impl<'a> From<Cow<'a, str>> for Value {
78
4
    fn from(value: Cow<'a, str>) -> Self {
79
4
        String::from(value).into()
80
4
    }
81
}
82

            
83
impl From<String> for Value {
84
140
    fn from(value: String) -> Self {
85
140
        Self::String(value)
86
140
    }
87
}
88

            
89
/// Special case to allow `Value::from(b"byte string")`
90
impl<const N: usize> From<&'static [u8; N]> for Value {
91
4
    fn from(value: &'static [u8; N]) -> Self {
92
4
        Self::Bytes(Vec::from(*value))
93
4
    }
94
}
95

            
96
impl<T: Into<Value>> FromIterator<T> for Value {
97
16
    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
98
16
        Self::Seq(iter.into_iter().map(Into::into).collect())
99
16
    }
100
}
101

            
102
impl<'a, T: Clone + Into<Value>> From<&'a [T]> for Value {
103
4
    fn from(value: &'a [T]) -> Self {
104
4
        value.iter().map(Clone::clone).map(Into::into).collect()
105
4
    }
106
}
107

            
108
impl<T: Into<Value>> From<Vec<T>> for Value {
109
8
    fn from(value: Vec<T>) -> Self {
110
8
        value.into_iter().collect()
111
8
    }
112
}
113

            
114
impl From<()> for Value {
115
4
    fn from(_value: ()) -> Self {
116
4
        Value::Unit
117
4
    }
118
}
119

            
120
impl Value {
121
    /// Tries to deserialize this [`Value`] into `T`.
122
48
    pub fn into_rust<T>(self) -> Result<T>
123
48
    where
124
48
        T: DeserializeOwned,
125
48
    {
126
48
        T::deserialize(self)
127
48
    }
128
}
129

            
130
/// Deserializer implementation for RON [`Value`].
131
/// This does not support enums (because [`Value`] does not store them).
132
impl<'de> Deserializer<'de> for Value {
133
    type Error = Error;
134

            
135
    forward_to_deserialize_any! {
136
        bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
137
        byte_buf option unit unit_struct newtype_struct seq tuple
138
        tuple_struct map struct enum identifier ignored_any
139
    }
140

            
141
    #[cfg(feature = "integer128")]
142
    forward_to_deserialize_any! {
143
        i128 u128
144
    }
145

            
146
368
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
147
368
    where
148
368
        V: Visitor<'de>,
149
368
    {
150
24
        match self {
151
16
            Value::Bool(b) => visitor.visit_bool(b),
152
40
            Value::Char(c) => visitor.visit_char(c),
153
28
            Value::Map(m) => {
154
28
                let old_len = m.len();
155
28

            
156
28
                let mut items: Vec<(Value, Value)> = m.into_iter().collect();
157
28
                items.reverse();
158

            
159
28
                let value = visitor.visit_map(MapAccessor {
160
28
                    items: &mut items,
161
28
                    value: None,
162
28
                })?;
163

            
164
20
                if items.is_empty() {
165
12
                    Ok(value)
166
                } else {
167
8
                    Err(Error::ExpectedDifferentLength {
168
8
                        expected: format!("a map of length {}", old_len - items.len()),
169
8
                        found: old_len,
170
8
                    })
171
                }
172
            }
173
124
            Value::Number(number) => number.visit(visitor),
174
16
            Value::Option(Some(o)) => visitor.visit_some(*o),
175
8
            Value::Option(None) => visitor.visit_none(),
176
60
            Value::String(s) => visitor.visit_string(s),
177
16
            Value::Bytes(b) => visitor.visit_byte_buf(b),
178
48
            Value::Seq(mut seq) => {
179
48
                let old_len = seq.len();
180
48

            
181
48
                seq.reverse();
182
48
                let value = visitor.visit_seq(SeqAccessor { seq: &mut seq })?;
183

            
184
44
                if seq.is_empty() {
185
36
                    Ok(value)
186
                } else {
187
8
                    Err(Error::ExpectedDifferentLength {
188
8
                        expected: format!("a sequence of length {}", old_len - seq.len()),
189
8
                        found: old_len,
190
8
                    })
191
                }
192
            }
193
12
            Value::Unit => visitor.visit_unit(),
194
        }
195
368
    }
196
}
197

            
198
struct SeqAccessor<'a> {
199
    seq: &'a mut Vec<Value>,
200
}
201

            
202
impl<'a, 'de> SeqAccess<'de> for SeqAccessor<'a> {
203
    type Error = Error;
204

            
205
112
    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
206
112
    where
207
112
        T: DeserializeSeed<'de>,
208
112
    {
209
112
        // The `Vec` is reversed, so we can pop to get the originally first element
210
112
        self.seq
211
112
            .pop()
212
112
            .map_or(Ok(None), |v| seed.deserialize(v).map(Some))
213
112
    }
214

            
215
8
    fn size_hint(&self) -> Option<usize> {
216
8
        Some(self.seq.len())
217
8
    }
218
}
219

            
220
struct MapAccessor<'a> {
221
    items: &'a mut Vec<(Value, Value)>,
222
    value: Option<Value>,
223
}
224

            
225
impl<'a, 'de> MapAccess<'de> for MapAccessor<'a> {
226
    type Error = Error;
227

            
228
40
    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
229
40
    where
230
40
        K: DeserializeSeed<'de>,
231
40
    {
232
40
        // The `Vec` is reversed, so we can pop to get the originally first element
233
40
        match self.items.pop() {
234
28
            Some((key, value)) => {
235
28
                self.value = Some(value);
236
28
                seed.deserialize(key).map(Some)
237
            }
238
12
            None => Ok(None),
239
        }
240
40
    }
241

            
242
    #[allow(clippy::panic)]
243
32
    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
244
32
    where
245
32
        V: DeserializeSeed<'de>,
246
32
    {
247
32
        match self.value.take() {
248
28
            Some(value) => seed.deserialize(value),
249
4
            None => panic!("Contract violation: value before key"),
250
        }
251
28
    }
252

            
253
2
    fn size_hint(&self) -> Option<usize> {
254
2
        Some(self.items.len())
255
2
    }
256
}
257

            
258
#[cfg(test)]
259
mod tests {
260
    use alloc::{collections::BTreeMap, vec};
261
    use core::fmt::Debug;
262

            
263
    use serde::Deserialize;
264

            
265
    use super::*;
266

            
267
64
    fn assert_same<'de, T>(s: &'de str)
268
64
    where
269
64
        T: Debug + Deserialize<'de> + PartialEq,
270
64
    {
271
        use crate::de::from_str;
272

            
273
64
        let direct: T = from_str(s).unwrap();
274
64
        let value: Value = from_str(s).unwrap();
275
64
        let de = T::deserialize(value.clone()).unwrap();
276
64

            
277
64
        assert_eq!(direct, de, "Deserialization for {:?} is not the same", s);
278

            
279
64
        let value_roundtrip = Value::deserialize(value.clone()).unwrap();
280
64
        assert_eq!(value_roundtrip, value);
281
64
    }
282

            
283
8
    fn assert_same_bytes<'de, T>(s: &'de [u8])
284
8
    where
285
8
        T: Debug + Deserialize<'de> + PartialEq,
286
8
    {
287
        use crate::de::from_bytes;
288

            
289
8
        let direct: T = from_bytes(s).unwrap();
290
8
        let value: Value = from_bytes(s).unwrap();
291
8
        let de = T::deserialize(value.clone()).unwrap();
292
8

            
293
8
        assert_eq!(direct, de, "Deserialization for {:?} is not the same", s);
294

            
295
8
        let value_roundtrip = Value::deserialize(value.clone()).unwrap();
296
8
        assert_eq!(value_roundtrip, value);
297
8
    }
298

            
299
    #[test]
300
4
    fn boolean() {
301
4
        assert_same::<bool>("true");
302
4
        assert_same::<bool>("false");
303
4

            
304
4
        assert_eq!(Value::from(true), Value::Bool(true));
305
4
        assert_eq!(Value::from(false), Value::Bool(false));
306
4
    }
307

            
308
    #[test]
309
4
    fn float() {
310
4
        assert_same::<f64>("0.123");
311
4
        assert_same::<f64>("-4.19");
312
4

            
313
4
        assert_eq!(
314
4
            Value::from(42_f32),
315
4
            Value::Number(Number::F32(42_f32.into()))
316
4
        );
317
4
        assert_eq!(
318
4
            Value::from(42_f64),
319
4
            Value::Number(Number::F64(42_f64.into()))
320
4
        );
321
4
    }
322

            
323
    #[test]
324
4
    fn int() {
325
4
        assert_same::<u32>("626");
326
4
        assert_same::<i32>("-50");
327
4

            
328
4
        assert_eq!(Value::from(0_i8), Value::Number(Number::I8(0)));
329
4
        assert_eq!(Value::from(0_i16), Value::Number(Number::I16(0)));
330
4
        assert_eq!(Value::from(0_i32), Value::Number(Number::I32(0)));
331
4
        assert_eq!(Value::from(0_i64), Value::Number(Number::I64(0)));
332
        #[cfg(feature = "integer128")]
333
2
        assert_eq!(Value::from(0_i128), Value::Number(Number::I128(0)));
334
4
        assert_eq!(Value::from(0_u8), Value::Number(Number::U8(0)));
335
4
        assert_eq!(Value::from(0_u16), Value::Number(Number::U16(0)));
336
4
        assert_eq!(Value::from(0_u32), Value::Number(Number::U32(0)));
337
4
        assert_eq!(Value::from(0_u64), Value::Number(Number::U64(0)));
338
        #[cfg(feature = "integer128")]
339
2
        assert_eq!(Value::from(0_u128), Value::Number(Number::U128(0)));
340
4
    }
341

            
342
    #[test]
343
4
    fn char() {
344
4
        assert_same::<char>("'4'");
345
4
        assert_same::<char>("'c'");
346
4

            
347
4
        assert_eq!(Value::from('🦀'), Value::Char('🦀'));
348
4
    }
349

            
350
    #[test]
351
4
    fn string() {
352
4
        assert_same::<String>(r#""hello world""#);
353
4
        assert_same::<String>(r#""this is a Rusty 🦀 string""#);
354
4
        assert_same::<String>(r#""this is now valid UTF-8 \xf0\x9f\xa6\x80""#);
355
4

            
356
4
        assert_eq!(Value::from("slice"), Value::String(String::from("slice")));
357
4
        assert_eq!(
358
4
            Value::from(String::from("string")),
359
4
            Value::String(String::from("string"))
360
4
        );
361
4
        assert_eq!(
362
4
            Value::from(Cow::Borrowed("cow")),
363
4
            Value::String(String::from("cow"))
364
4
        );
365
4
    }
366

            
367
    #[test]
368
4
    fn bytes() {
369
4
        assert_same_bytes::<serde_bytes::ByteBuf>(br#"b"hello world""#);
370
4
        assert_same_bytes::<serde_bytes::ByteBuf>(
371
4
            br#"b"this is not valid UTF-8 \xf8\xa1\xa1\xa1\xa1""#,
372
4
        );
373
4

            
374
4
        assert_eq!(Value::from(b"bytes"), Value::Bytes(Vec::from(*b"bytes")));
375
4
    }
376

            
377
    #[test]
378
4
    fn map() {
379
4
        assert_same::<BTreeMap<char, String>>(
380
4
            "{
381
4
'a': \"Hello\",
382
4
'b': \"Bye\",
383
4
        }",
384
4
        );
385
4

            
386
4
        assert_eq!(Value::from(Map::new()), Value::Map(Map::new()));
387
4
        assert_eq!(
388
4
            Value::from_iter([("a", 42)]),
389
4
            Value::Map({
390
4
                let mut map = Map::new();
391
4
                map.insert(Value::from("a"), Value::from(42));
392
4
                map
393
4
            })
394
4
        );
395
4
    }
396

            
397
    #[test]
398
4
    fn option() {
399
4
        assert_same::<Option<char>>("Some('a')");
400
4
        assert_same::<Option<char>>("None");
401
4

            
402
4
        assert_eq!(Value::from(Option::<bool>::None), Value::Option(None));
403
4
        assert_eq!(
404
4
            Value::from(Some(false)),
405
4
            Value::Option(Some(Box::new(Value::Bool(false))))
406
4
        );
407
4
        assert_eq!(
408
4
            Value::from(Some(Option::<bool>::None)),
409
4
            Value::Option(Some(Box::new(Value::Option(None))))
410
4
        );
411
4
    }
412

            
413
    #[test]
414
4
    fn seq() {
415
4
        assert_same::<Vec<f64>>("[1.0, 2.0, 3.0, 4.0]");
416
4

            
417
4
        assert_eq!(
418
4
            Value::from([-1_i8, 2, -3].as_slice()),
419
4
            Value::Seq(vec![
420
4
                Value::from(-1_i8),
421
4
                Value::from(2_i8),
422
4
                Value::from(-3_i8)
423
4
            ])
424
4
        );
425
4
        assert_eq!(
426
4
            Value::from(vec![-1_i8, 2, -3]),
427
4
            Value::Seq(vec![
428
4
                Value::from(-1_i8),
429
4
                Value::from(2_i8),
430
4
                Value::from(-3_i8)
431
4
            ])
432
4
        );
433
4
        assert_eq!(
434
4
            Value::from_iter([-1_i8, 2, -3]),
435
4
            Value::Seq(vec![
436
4
                Value::from(-1_i8),
437
4
                Value::from(2_i8),
438
4
                Value::from(-3_i8)
439
4
            ])
440
4
        );
441
4
    }
442

            
443
    #[test]
444
4
    fn unit() {
445
4
        assert_same::<()>("()");
446
4

            
447
4
        assert_eq!(Value::from(()), Value::Unit);
448
4
    }
449

            
450
    #[test]
451
    #[should_panic(expected = "Contract violation: value before key")]
452
4
    fn map_access_contract_violation() {
453
        struct BadVisitor;
454

            
455
        impl<'de> Visitor<'de> for BadVisitor {
456
            type Value = ();
457

            
458
            // GRCOV_EXCL_START
459
            fn expecting(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
460
                fmt.write_str("a map")
461
            }
462
            // GRCOV_EXCL_STOP
463

            
464
4
            fn visit_map<A: serde::de::MapAccess<'de>>(
465
4
                self,
466
4
                mut map: A,
467
4
            ) -> Result<Self::Value, A::Error> {
468
4
                map.next_value::<()>()
469
4
            }
470
        }
471

            
472
4
        let value = Value::Map([("a", 42)].into_iter().collect());
473
4
        let _ = value.deserialize_map(BadVisitor);
474
4
    }
475

            
476
    #[test]
477
4
    fn transparent_value_newtype() {
478
        struct NewtypeDeserializer;
479

            
480
        impl<'de> Deserializer<'de> for NewtypeDeserializer {
481
            type Error = Error;
482

            
483
4
            fn deserialize_any<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
484
4
                visitor.visit_newtype_struct(serde::de::value::CharDeserializer::new('🦀'))
485
4
            }
486

            
487
            // GRCOV_EXCL_START
488
            forward_to_deserialize_any! {
489
                bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string
490
                bytes byte_buf option unit unit_struct newtype_struct seq tuple
491
                tuple_struct map struct enum identifier ignored_any
492
            }
493

            
494
            #[cfg(feature = "integer128")]
495
            forward_to_deserialize_any! { i128 u128 }
496
            // GRCOV_EXCL_STOP
497
        }
498

            
499
4
        assert_eq!(
500
4
            Value::deserialize(NewtypeDeserializer).unwrap(),
501
4
            Value::from('🦀')
502
4
        );
503
4
    }
504
}