1
use alloc::{borrow::ToOwned, boxed::Box, string::String, vec::Vec};
2
use core::fmt;
3

            
4
use serde::{
5
    de::{Error, MapAccess, SeqAccess, Visitor},
6
    Deserialize, Deserializer,
7
};
8

            
9
use crate::{
10
    error::SpannedResult,
11
    value::{Map, Number, Value},
12
};
13

            
14
impl core::str::FromStr for Value {
15
    type Err = crate::error::SpannedError;
16

            
17
    /// Creates a value from a string reference.
18
5628
    fn from_str(s: &str) -> SpannedResult<Self> {
19
5628
        let mut de = super::Deserializer::from_str(s)?;
20

            
21
5628
        let val = Value::deserialize(&mut de).map_err(|e| de.span_error(e))?;
22
5310
        de.end().map_err(|e| de.span_error(e))?;
23

            
24
5306
        Ok(val)
25
5628
    }
26
}
27

            
28
impl<'de> Deserialize<'de> for Value {
29
10029877
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
30
10029877
    where
31
10029877
        D: Deserializer<'de>,
32
    {
33
10029877
        deserializer.deserialize_any(ValueVisitor)
34
10029877
    }
35
}
36

            
37
struct ValueVisitor;
38

            
39
impl<'de> Visitor<'de> for ValueVisitor {
40
    type Value = Value;
41

            
42
82470
    fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
43
82470
        write!(f, "a RON value")
44
82470
    }
45

            
46
1880
    fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
47
1880
    where
48
1880
        E: Error,
49
    {
50
1880
        Ok(Value::Bool(v))
51
1880
    }
52

            
53
628
    fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
54
628
    where
55
628
        E: Error,
56
    {
57
628
        Ok(Value::Number(Number::new(v)))
58
628
    }
59

            
60
620
    fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
61
620
    where
62
620
        E: Error,
63
    {
64
620
        Ok(Value::Number(Number::new(v)))
65
620
    }
66

            
67
620
    fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
68
620
    where
69
620
        E: Error,
70
    {
71
620
        Ok(Value::Number(Number::new(v)))
72
620
    }
73

            
74
620
    fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
75
620
    where
76
620
        E: Error,
77
    {
78
620
        Ok(Value::Number(Number::new(v)))
79
620
    }
80

            
81
    #[cfg(feature = "integer128")]
82
310
    fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
83
310
    where
84
310
        E: Error,
85
    {
86
310
        Ok(Value::Number(Number::new(v)))
87
310
    }
88

            
89
250520
    fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
90
250520
    where
91
250520
        E: Error,
92
    {
93
250520
        Ok(Value::Number(Number::new(v)))
94
250520
    }
95

            
96
628
    fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
97
628
    where
98
628
        E: Error,
99
    {
100
628
        Ok(Value::Number(Number::new(v)))
101
628
    }
102

            
103
620
    fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
104
620
    where
105
620
        E: Error,
106
    {
107
620
        Ok(Value::Number(Number::new(v)))
108
620
    }
109

            
110
620
    fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
111
620
    where
112
620
        E: Error,
113
    {
114
620
        Ok(Value::Number(Number::new(v)))
115
620
    }
116

            
117
    #[cfg(feature = "integer128")]
118
465
    fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
119
465
    where
120
465
        E: Error,
121
    {
122
465
        Ok(Value::Number(Number::new(v)))
123
465
    }
124

            
125
14193
    fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
126
14193
    where
127
14193
        E: Error,
128
    {
129
14193
        Ok(Value::Number(Number::new(v)))
130
14193
    }
131

            
132
9619316
    fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
133
9619316
    where
134
9619316
        E: Error,
135
    {
136
9619316
        Ok(Value::Number(Number::new(v)))
137
9619316
    }
138

            
139
3764
    fn visit_char<E>(self, v: char) -> Result<Self::Value, E>
140
3764
    where
141
3764
        E: Error,
142
    {
143
3764
        Ok(Value::Char(v))
144
3764
    }
145

            
146
26136
    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
147
26136
    where
148
26136
        E: Error,
149
    {
150
26136
        self.visit_string(v.to_owned())
151
26136
    }
152

            
153
27090
    fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
154
27090
    where
155
27090
        E: Error,
156
    {
157
27090
        Ok(Value::String(v))
158
27090
    }
159

            
160
4034
    fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
161
4034
    where
162
4034
        E: Error,
163
    {
164
4034
        self.visit_byte_buf(v.to_vec())
165
4034
    }
166

            
167
4666
    fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
168
4666
    where
169
4666
        E: Error,
170
    {
171
4666
        Ok(Value::Bytes(v))
172
4666
    }
173

            
174
632
    fn visit_none<E>(self) -> Result<Self::Value, E>
175
632
    where
176
632
        E: Error,
177
    {
178
632
        Ok(Value::Option(None))
179
632
    }
180

            
181
4364
    fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
182
4364
    where
183
4364
        D: Deserializer<'de>,
184
    {
185
4364
        Ok(Value::Option(Some(Box::new(
186
4364
            deserializer.deserialize_any(ValueVisitor)?,
187
        ))))
188
4364
    }
189

            
190
5910
    fn visit_unit<E>(self) -> Result<Self::Value, E>
191
5910
    where
192
5910
        E: Error,
193
    {
194
5910
        Ok(Value::Unit)
195
5910
    }
196

            
197
4
    fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
198
4
    where
199
4
        D: Deserializer<'de>,
200
    {
201
4
        deserializer.deserialize_any(ValueVisitor)
202
4
    }
203

            
204
9032
    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
205
9032
    where
206
9032
        A: SeqAccess<'de>,
207
    {
208
9032
        let mut vec = Vec::new();
209
9032
        if let Some(cap) = seq.size_hint() {
210
16
            vec.reserve_exact(cautious_size_hint::<Value>(cap));
211
9016
        }
212

            
213
9631230
        while let Some(x) = seq.next_element()? {
214
9622198
            vec.push(x);
215
9622198
        }
216

            
217
8098
        Ok(Value::Seq(vec))
218
9032
    }
219

            
220
91188
    fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
221
91188
    where
222
91188
        A: MapAccess<'de>,
223
    {
224
91188
        let mut res: Map = Map::new();
225

            
226
        #[cfg(feature = "indexmap")]
227
46508
        if let Some(cap) = map.size_hint() {
228
8
            res.0
229
8
                .reserve_exact(cautious_size_hint::<(Value, Value)>(cap));
230
46500
        }
231

            
232
109254
        while let Some(entry) = map.next_entry::<Value, Value>()? {
233
18066
            res.insert(entry.0, entry.1);
234
18066
        }
235

            
236
12448
        Ok(Value::Map(res))
237
91188
    }
238
}
239

            
240
/// Caps a size hint to at most 1 MiB of preallocation, like serde's own
241
/// collection impls, since other formats read it from untrusted input
242
1404
fn cautious_size_hint<T>(hint: usize) -> usize {
243
    const MAX_PREALLOC_BYTES: usize = 1024 * 1024;
244

            
245
1404
    match core::mem::size_of::<T>() {
246
        0 => 0,
247
1404
        size => hint.min(MAX_PREALLOC_BYTES / size),
248
    }
249
1404
}
250

            
251
#[cfg(test)]
252
mod tests {
253
    use alloc::vec;
254
    use core::str::FromStr;
255

            
256
    use super::*;
257

            
258
36
    fn eval(s: &str) -> Value {
259
36
        s.parse().expect("Failed to parse")
260
36
    }
261

            
262
    #[test]
263
4
    fn test_none() {
264
4
        assert_eq!(eval("None"), Value::Option(None));
265
4
    }
266

            
267
    #[test]
268
4
    fn test_some() {
269
4
        assert_eq!(eval("Some(())"), Value::Option(Some(Box::new(Value::Unit))));
270
4
        assert_eq!(
271
4
            eval("Some  (  () )"),
272
4
            Value::Option(Some(Box::new(Value::Unit)))
273
        );
274
4
    }
275

            
276
    #[test]
277
4
    fn test_tuples_basic() {
278
4
        assert_eq!(
279
4
            eval("(3, 4.0, 5.0)"),
280
4
            Value::Seq(vec![
281
4
                Value::Number(Number::U8(3)),
282
4
                Value::Number(Number::F32(4.0.into())),
283
4
                Value::Number(Number::F32(5.0.into())),
284
4
            ],),
285
        );
286
4
    }
287

            
288
    #[test]
289
4
    fn test_tuples_ident() {
290
4
        assert_eq!(
291
4
            eval("(true, 3, 4, 5.0)"),
292
4
            Value::Seq(vec![
293
4
                Value::Bool(true),
294
4
                Value::Number(Number::U8(3)),
295
4
                Value::Number(Number::U8(4)),
296
4
                Value::Number(Number::F32(5.0.into())),
297
4
            ]),
298
        );
299
4
    }
300

            
301
    #[test]
302
4
    fn test_tuples_error() {
303
        use crate::de::{Error, Position, Span, SpannedError};
304

            
305
4
        assert_eq!(
306
4
            Value::from_str("Foo:").unwrap_err(),
307
            SpannedError {
308
                code: Error::TrailingCharacters,
309
                span: Span {
310
                    start: Position { line: 1, col: 4 },
311
                    end: Position { line: 1, col: 4 }
312
                }
313
            },
314
        );
315
4
    }
316

            
317
    #[test]
318
4
    fn test_floats() {
319
4
        assert_eq!(
320
4
            eval("(inf, -inf, NaN)"),
321
4
            Value::Seq(vec![
322
4
                Value::Number(Number::new(core::f32::INFINITY)),
323
4
                Value::Number(Number::new(core::f32::NEG_INFINITY)),
324
4
                Value::Number(Number::new(core::f32::NAN)),
325
4
            ]),
326
        );
327
4
    }
328

            
329
    #[test]
330
4
    fn test_complex() {
331
4
        assert_eq!(
332
4
            eval(
333
4
                "Some([
334
4
    Room ( width: 20, height: 5, name: \"The Room\" ),
335
4

            
336
4
    (
337
4
        width: 10.0,
338
4
        height: 10.0,
339
4
        name: \"Another room\",
340
4
        enemy_levels: {
341
4
            \"Enemy1\": 3,
342
4
            \"Enemy2\": 5,
343
4
            \"Enemy3\": 7,
344
4
        },
345
4
    ),
346
4
])"
347
            ),
348
4
            Value::Option(Some(Box::new(Value::Seq(vec![
349
4
                Value::Map(
350
4
                    vec![
351
4
                        (
352
4
                            Value::String("width".to_owned()),
353
4
                            Value::Number(Number::U8(20)),
354
4
                        ),
355
4
                        (
356
4
                            Value::String("height".to_owned()),
357
4
                            Value::Number(Number::U8(5)),
358
4
                        ),
359
4
                        (
360
4
                            Value::String("name".to_owned()),
361
4
                            Value::String("The Room".to_owned()),
362
4
                        ),
363
4
                    ]
364
4
                    .into_iter()
365
4
                    .collect(),
366
4
                ),
367
4
                Value::Map(
368
4
                    vec![
369
4
                        (
370
4
                            Value::String("width".to_owned()),
371
4
                            Value::Number(Number::F32(10.0.into())),
372
4
                        ),
373
4
                        (
374
4
                            Value::String("height".to_owned()),
375
4
                            Value::Number(Number::F32(10.0.into())),
376
4
                        ),
377
4
                        (
378
4
                            Value::String("name".to_owned()),
379
4
                            Value::String("Another room".to_owned()),
380
4
                        ),
381
4
                        (
382
4
                            Value::String("enemy_levels".to_owned()),
383
4
                            Value::Map(
384
4
                                vec![
385
4
                                    (
386
4
                                        Value::String("Enemy1".to_owned()),
387
4
                                        Value::Number(Number::U8(3)),
388
4
                                    ),
389
4
                                    (
390
4
                                        Value::String("Enemy2".to_owned()),
391
4
                                        Value::Number(Number::U8(5)),
392
4
                                    ),
393
4
                                    (
394
4
                                        Value::String("Enemy3".to_owned()),
395
4
                                        Value::Number(Number::U8(7)),
396
4
                                    ),
397
4
                                ]
398
4
                                .into_iter()
399
4
                                .collect(),
400
4
                            ),
401
4
                        ),
402
4
                    ]
403
4
                    .into_iter()
404
4
                    .collect(),
405
4
                ),
406
4
            ]))))
407
        );
408
4
    }
409

            
410
    #[test]
411
4
    fn test_struct() {
412
4
        assert_eq!(
413
4
            eval("(a:42)"),
414
4
            Value::Map(
415
4
                [(
416
4
                    Value::String(String::from("a")),
417
4
                    Value::Number(Number::U8(42))
418
4
                )]
419
4
                .into_iter()
420
4
                .collect()
421
4
            ),
422
        );
423
4
        assert_eq!(
424
4
            eval("(r#a:42)"),
425
4
            Value::Map(
426
4
                [(
427
4
                    Value::String(String::from("a")),
428
4
                    Value::Number(Number::U8(42))
429
4
                )]
430
4
                .into_iter()
431
4
                .collect()
432
4
            ),
433
        );
434
4
        assert_eq!(
435
4
            "(r#:42)".parse::<Value>().unwrap_err(),
436
            crate::error::SpannedError {
437
                code: crate::Error::ExpectedString,
438
                span: crate::error::Span {
439
                    start: crate::error::Position { line: 1, col: 3 },
440
                    end: crate::error::Position { line: 1, col: 4 },
441
                }
442
            },
443
        );
444

            
445
        // Check for a failure in Deserializer::check_struct_type
446
        // - opening brace triggers the struct type check
447
        // - unclosed block comment fails the whitespace skip
448
4
        assert_eq!(
449
4
            "( /*".parse::<Value>().unwrap_err(),
450
            crate::error::SpannedError {
451
                code: crate::Error::UnclosedBlockComment,
452
                span: crate::error::Span {
453
                    start: crate::error::Position { line: 1, col: 3 },
454
                    end: crate::error::Position { line: 1, col: 5 },
455
                }
456
            },
457
        );
458
4
    }
459
}