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
338661
    {
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
1688
    {
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
564
    {
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
556
    {
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
556
    {
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
556
    {
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
278
    {
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
221606
    {
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
564
    {
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
556
    {
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
556
    {
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
417
    {
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
5509
    {
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
5298
    {
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
1712
    {
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
8992
    {
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
9016
    {
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
1672
    {
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
2240
    {
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
568
    {
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
3916
    {
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
3356
    {
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
4
    {
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
5590
    {
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
75374
    {
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
4
        );
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
4
        );
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
4
        );
287
4
    }
288

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

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

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

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

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

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

            
427
        // Check for a failure in Deserializer::check_struct_type
428
        // - opening brace triggers the struct type check
429
        // - unclosed block comment fails the whitespace skip
430
4
        assert_eq!(
431
4
            "( /*".parse::<Value>().unwrap_err(),
432
4
            crate::error::SpannedError {
433
4
                code: crate::Error::UnclosedBlockComment,
434
4
                position: crate::error::Position { line: 1, col: 5 },
435
4
            },
436
4
        );
437
4
    }
438
}