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
5052
    fn from_str(s: &str) -> SpannedResult<Self> {
19
5052
        let mut de = super::Deserializer::from_str(s)?;
20

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

            
24
4762
        Ok(val)
25
5052
    }
26
}
27

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

            
37
struct ValueVisitor;
38

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            
190
3356
    fn visit_unit<E>(self) -> Result<Self::Value, E>
191
3356
    where
192
3356
        E: Error,
193
    {
194
3356
        Ok(Value::Unit)
195
3356
    }
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
5590
    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
205
5590
    where
206
5590
        A: SeqAccess<'de>,
207
    {
208
5590
        let mut vec = Vec::new();
209
5590
        if let Some(cap) = seq.size_hint() {
210
4
            vec.reserve_exact(cap);
211
5586
        }
212

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

            
217
5030
        Ok(Value::Seq(vec))
218
5590
    }
219

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

            
226
        #[cfg(feature = "indexmap")]
227
38514
        if let Some(cap) = map.size_hint() {
228
2
            res.0.reserve_exact(cap);
229
38512
        }
230

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

            
235
4762
        Ok(Value::Map(res))
236
75374
    }
237
}
238

            
239
#[cfg(test)]
240
mod tests {
241
    use alloc::vec;
242
    use core::str::FromStr;
243

            
244
    use super::*;
245

            
246
36
    fn eval(s: &str) -> Value {
247
36
        s.parse().expect("Failed to parse")
248
36
    }
249

            
250
    #[test]
251
4
    fn test_none() {
252
4
        assert_eq!(eval("None"), Value::Option(None));
253
4
    }
254

            
255
    #[test]
256
4
    fn test_some() {
257
4
        assert_eq!(eval("Some(())"), Value::Option(Some(Box::new(Value::Unit))));
258
4
        assert_eq!(
259
4
            eval("Some  (  () )"),
260
4
            Value::Option(Some(Box::new(Value::Unit)))
261
        );
262
4
    }
263

            
264
    #[test]
265
4
    fn test_tuples_basic() {
266
4
        assert_eq!(
267
4
            eval("(3, 4.0, 5.0)"),
268
4
            Value::Seq(vec![
269
4
                Value::Number(Number::U8(3)),
270
4
                Value::Number(Number::F32(4.0.into())),
271
4
                Value::Number(Number::F32(5.0.into())),
272
4
            ],),
273
        );
274
4
    }
275

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

            
289
    #[test]
290
4
    fn test_tuples_error() {
291
        use crate::de::{Error, Position, Span, SpannedError};
292

            
293
4
        assert_eq!(
294
4
            Value::from_str("Foo:").unwrap_err(),
295
            SpannedError {
296
                code: Error::TrailingCharacters,
297
                span: Span {
298
                    start: Position { line: 1, col: 4 },
299
                    end: Position { line: 1, col: 4 }
300
                }
301
            },
302
        );
303
4
    }
304

            
305
    #[test]
306
4
    fn test_floats() {
307
4
        assert_eq!(
308
4
            eval("(inf, -inf, NaN)"),
309
4
            Value::Seq(vec![
310
4
                Value::Number(Number::new(core::f32::INFINITY)),
311
4
                Value::Number(Number::new(core::f32::NEG_INFINITY)),
312
4
                Value::Number(Number::new(core::f32::NAN)),
313
4
            ]),
314
        );
315
4
    }
316

            
317
    #[test]
318
4
    fn test_complex() {
319
4
        assert_eq!(
320
4
            eval(
321
4
                "Some([
322
4
    Room ( width: 20, height: 5, name: \"The Room\" ),
323
4

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

            
398
    #[test]
399
4
    fn test_struct() {
400
4
        assert_eq!(
401
4
            eval("(a:42)"),
402
4
            Value::Map(
403
4
                [(
404
4
                    Value::String(String::from("a")),
405
4
                    Value::Number(Number::U8(42))
406
4
                )]
407
4
                .into_iter()
408
4
                .collect()
409
4
            ),
410
        );
411
4
        assert_eq!(
412
4
            eval("(r#a:42)"),
413
4
            Value::Map(
414
4
                [(
415
4
                    Value::String(String::from("a")),
416
4
                    Value::Number(Number::U8(42))
417
4
                )]
418
4
                .into_iter()
419
4
                .collect()
420
4
            ),
421
        );
422
4
        assert_eq!(
423
4
            "(r#:42)".parse::<Value>().unwrap_err(),
424
            crate::error::SpannedError {
425
                code: crate::Error::ExpectedString,
426
                span: crate::error::Span {
427
                    start: crate::error::Position { line: 1, col: 3 },
428
                    end: crate::error::Position { line: 1, col: 4 },
429
                }
430
            },
431
        );
432

            
433
        // Check for a failure in Deserializer::check_struct_type
434
        // - opening brace triggers the struct type check
435
        // - unclosed block comment fails the whitespace skip
436
4
        assert_eq!(
437
4
            "( /*".parse::<Value>().unwrap_err(),
438
            crate::error::SpannedError {
439
                code: crate::Error::UnclosedBlockComment,
440
                span: crate::error::Span {
441
                    start: crate::error::Position { line: 1, col: 3 },
442
                    end: crate::error::Position { line: 1, col: 5 },
443
                }
444
            },
445
        );
446
4
    }
447
}