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
pub(crate) use number::{NumberDeserializer, NumberSerializer};
20
#[allow(clippy::useless_attribute, clippy::module_name_repetitions)]
21
pub use raw::RawValue;
22

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            
264
    use serde::Deserialize;
265

            
266
    use super::*;
267

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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