1
/*
2
 * Hurl (https://hurl.dev)
3
 * Copyright (C) 2025 Orange
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at
8
 *
9
 *          http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 */
18
use super::placeholder;
19
use crate::ast::{JsonListElement, JsonObjectElement, JsonValue, SourceInfo, Template};
20
use crate::combinator::{choice, non_recover, ParseError as ParseErrorTrait};
21
use crate::parser::primitives::{boolean, hex_digit, literal, try_literal};
22
use crate::parser::template::EncodedString;
23
use crate::parser::{templatize, JsonErrorVariant, ParseError, ParseErrorKind, ParseResult};
24
use crate::reader::{Pos, Reader};
25

            
26
28125
pub fn parse(reader: &mut Reader) -> ParseResult<JsonValue> {
27
28125
    choice(
28
28125
        &[
29
28125
            null_value,
30
28125
            boolean_value,
31
28125
            string_value,
32
28125
            number_value,
33
28125
            expression_value,
34
28125
            list_value,
35
28125
            object_value,
36
28125
        ],
37
28125
        reader,
38
28125
    )
39
}
40

            
41
/// Helper for parse, but already knowing that we are inside a JSON body.
42
2790
fn parse_in_json(reader: &mut Reader) -> ParseResult<JsonValue> {
43
2790
    if let Some(c) = reader.peek() {
44
2790
        if c == ',' {
45
            let kind = ParseErrorKind::Json(JsonErrorVariant::EmptyElement);
46
            return Err(ParseError::new(reader.cursor().pos, false, kind));
47
        }
48
    }
49
2790
    match parse(reader) {
50
2750
        Ok(r) => Ok(r),
51
        // The only error that is recoverable is caused by reaching object_value try_literal('{'),
52
        // but this is not recoverable in this case, because we already know that we are in a JSON
53
        // body. So, we change the error to CannotResolve for the object found.
54
40
        Err(e) => match e {
55
            ParseError {
56
                recoverable: true, ..
57
            } => {
58
15
                let kind = ParseErrorKind::Json(JsonErrorVariant::ExpectingElement);
59
15
                Err(ParseError::new(e.pos, false, kind))
60
            }
61
25
            _ => Err(ParseError::new(e.pos, false, e.kind)),
62
        },
63
    }
64
}
65

            
66
28145
pub fn null_value(reader: &mut Reader) -> ParseResult<JsonValue> {
67
28145
    try_literal("null", reader)?;
68
40
    Ok(JsonValue::Null)
69
}
70

            
71
28115
pub fn boolean_value(reader: &mut Reader) -> ParseResult<JsonValue> {
72
28115
    let value = boolean(reader)?;
73
80
    Ok(JsonValue::Boolean(value))
74
}
75

            
76
28015
fn string_value(reader: &mut Reader) -> ParseResult<JsonValue> {
77
28015
    let template = string_template(reader)?;
78
970
    Ok(JsonValue::String(template))
79
}
80

            
81
29845
fn string_template(reader: &mut Reader) -> ParseResult<Template> {
82
29845
    try_literal("\"", reader)?;
83
2810
    let delimiter = Some('"');
84
2810
    let mut chars = vec![];
85
2810
    let start = reader.cursor();
86
    loop {
87
24370
        if reader.peek() == Some('"') || reader.is_eof() {
88
2800
            break;
89
        }
90
21570
        let char = any_char(reader)?;
91
21560
        chars.push(char);
92
    }
93
2800
    let end = reader.cursor();
94
2800

            
95
2800
    let encoded_string = EncodedString {
96
2800
        source_info: SourceInfo::new(start.pos, end.pos),
97
2800
        chars,
98
2800
    };
99
2800
    literal("\"", reader)?;
100
2800
    let elements = templatize(encoded_string)?;
101

            
102
2800
    let template = Template::new(delimiter, elements, SourceInfo::new(start.pos, end.pos));
103
2800
    Ok(template)
104
}
105

            
106
21570
fn any_char(reader: &mut Reader) -> ParseResult<(char, String, Pos)> {
107
21570
    let start = reader.cursor();
108
21570
    match escape_char(reader) {
109
295
        Ok(c) => Ok((c, reader.read_from(start.index), start.pos)),
110
21275
        Err(e) => {
111
21275
            if e.recoverable {
112
21265
                reader.seek(start);
113
21265
                match reader.read() {
114
                    None => {
115
                        let kind = ParseErrorKind::Expecting {
116
                            value: "char".to_string(),
117
                        };
118
                        Err(ParseError::new(start.pos, true, kind))
119
                    }
120
21265
                    Some(c) => {
121
21265
                        if ['\\', '\x08', '\n', '\x0c', '\r', '\t'].contains(&c) {
122
                            let kind = ParseErrorKind::Expecting {
123
                                value: "char".to_string(),
124
                            };
125
                            Err(ParseError::new(start.pos, true, kind))
126
                        } else {
127
21265
                            Ok((c, reader.read_from(start.index), start.pos))
128
                        }
129
                    }
130
                }
131
            } else {
132
10
                Err(e)
133
            }
134
        }
135
    }
136
}
137

            
138
21570
fn escape_char(reader: &mut Reader) -> ParseResult<char> {
139
21570
    try_literal("\\", reader)?;
140
305
    let start = reader.cursor();
141
305
    match reader.read() {
142
120
        Some('"') => Ok('"'),
143
5
        Some('\\') => Ok('\\'),
144
        Some('/') => Ok('/'),
145
        Some('b') => Ok('\x08'),
146
165
        Some('n') => Ok('\n'),
147
        Some('f') => Ok('\x0c'),
148
        Some('r') => Ok('\r'),
149
        Some('t') => Ok('\t'),
150
15
        Some('u') => unicode(reader),
151
        _ => Err(ParseError::new(
152
            start.pos,
153
            false,
154
            ParseErrorKind::EscapeChar,
155
        )),
156
    }
157
}
158

            
159
15
fn unicode(reader: &mut Reader) -> ParseResult<char> {
160
15
    let start = reader.cursor();
161
15
    let cp1 = hex_value(reader)?;
162
10
    let cp = if is_surrogate(cp1) {
163
10
        literal("\\u", reader)?;
164
10
        let start = reader.cursor();
165
10
        let cp2 = hex_value(reader)?;
166
10
        match cp_surrogate_pair(cp1, cp2) {
167
5
            None => return Err(ParseError::new(start.pos, false, ParseErrorKind::Unicode)),
168
5
            Some(cp) => cp,
169
        }
170
    } else {
171
        cp1
172
    };
173
5
    let c = match char::from_u32(cp) {
174
        None => return Err(ParseError::new(start.pos, false, ParseErrorKind::Unicode)),
175
5
        Some(c) => c,
176
5
    };
177
5
    Ok(c)
178
}
179

            
180
// 0xd800-0xdc00 encodes the high 10 bits of a pair.
181
// 0xdc00-0xe000 encodes the low 10 bits of a pair.
182
// the value is those 20 bits plus 0x10000.
183
const SURR1: u32 = 0xd800;
184
const SURR2: u32 = 0xdc00;
185
const SURR3: u32 = 0xe000;
186
const SURR_SELF: u32 = 0x10000;
187

            
188
/// Returns whether the specified Unicode code point can appear in a surrogate pair.
189
10
fn is_surrogate(cp: u32) -> bool {
190
10
    (SURR1..SURR3).contains(&cp)
191
}
192

            
193
10
fn cp_surrogate_pair(cp1: u32, cp2: u32) -> Option<u32> {
194
10
    if (SURR1..SURR2).contains(&cp1) && (SURR2..SURR3).contains(&cp2) {
195
5
        Some(((cp1 - SURR1) << 10) | ((cp2 - SURR2) + SURR_SELF))
196
    } else {
197
5
        None
198
    }
199
}
200

            
201
25
fn hex_value(reader: &mut Reader) -> ParseResult<u32> {
202
25
    let digit1 = non_recover(hex_digit, reader)?;
203
25
    let digit2 = non_recover(hex_digit, reader)?;
204
25
    let digit3 = non_recover(hex_digit, reader)?;
205
25
    let digit4 = non_recover(hex_digit, reader)?;
206
20
    let value = digit1 * (16 * 16 * 16) + digit2 * (16 * 16) + digit3 * 16 + digit4;
207
20
    Ok(value)
208
}
209

            
210
27075
pub fn number_value(reader: &mut Reader) -> ParseResult<JsonValue> {
211
27075
    let sign = match try_literal("-", reader) {
212
27035
        Err(_) => String::new(),
213
40
        Ok(_) => "-".to_string(),
214
    };
215
27075
    let int = integer(reader)?;
216
975
    let frac = fraction(reader)?;
217
975
    let exp = exponent(reader)?;
218
975
    Ok(JsonValue::Number(format!("{sign}{int}{frac}{exp}")))
219
}
220

            
221
27075
fn integer(reader: &mut Reader) -> ParseResult<String> {
222
27075
    let start = reader.cursor();
223
27075
    match try_literal("0", reader) {
224
        Err(_) => {
225
32040
            let digits = reader.read_while(|c| c.is_ascii_digit());
226
26855
            if digits.is_empty() {
227
26100
                let kind = ParseErrorKind::Expecting {
228
26100
                    value: "number".to_string(),
229
26100
                };
230
26100
                Err(ParseError::new(start.pos, true, kind))
231
            } else {
232
755
                Ok(digits)
233
            }
234
        }
235
220
        Ok(_) => Ok("0".to_string()),
236
    }
237
}
238

            
239
975
fn fraction(reader: &mut Reader) -> ParseResult<String> {
240
975
    match try_literal(".", reader) {
241
        Ok(_) => {
242
3825
            let digits = reader.read_while(|c| c.is_ascii_digit());
243
575
            if digits.is_empty() {
244
                let kind = ParseErrorKind::Expecting {
245
                    value: "digits".to_string(),
246
                };
247
                Err(ParseError::new(reader.cursor().pos, false, kind))
248
            } else {
249
575
                Ok(format!(".{digits}"))
250
            }
251
        }
252
400
        Err(_) => Ok(String::new()),
253
    }
254
}
255

            
256
975
fn exponent(reader: &mut Reader) -> ParseResult<String> {
257
975
    if reader.peek() == Some('e') || reader.peek() == Some('E') {
258
5
        reader.read();
259
5
        let exponent_sign = match try_literal("-", reader) {
260
            Ok(_) => "-".to_string(),
261
5
            Err(_) => match try_literal("+", reader) {
262
                Ok(_) => "+".to_string(),
263
5
                Err(_) => String::new(),
264
            },
265
        };
266
21
        let exponent_digits = reader.read_while(|c| c.is_ascii_digit());
267
5
        Ok(format!("e{exponent_sign}{exponent_digits}"))
268
    } else {
269
970
        Ok(String::new())
270
    }
271
}
272

            
273
26075
fn expression_value(reader: &mut Reader) -> ParseResult<JsonValue> {
274
26075
    let exp = placeholder::parse(reader)?;
275
55
    Ok(JsonValue::Placeholder(exp))
276
}
277

            
278
26020
fn list_value(reader: &mut Reader) -> ParseResult<JsonValue> {
279
26020
    try_literal("[", reader)?;
280
345
    let space0 = whitespace(reader);
281
345
    let mut elements = vec![];
282
345

            
283
345
    // at least one element
284
345
    if reader.peek() != Some(']') {
285
305
        let first_element = list_element(reader)?;
286
305
        elements.push(first_element);
287

            
288
        loop {
289
960
            if reader.peek() == Some(']') {
290
295
                break;
291
            }
292
665
            // Reports "expecting ']'" in case the user forgot to add the last ']', e.g
293
665
            // `[1, 2`
294
665
            if reader.peek() != Some(',') {
295
                break;
296
            }
297
665
            // The reader advances after literal(","), so this saves its position to report an
298
665
            // error in case it happens.
299
665
            let save = reader.cursor();
300
665
            literal(",", reader)?;
301
            // If there is one more comma, e.g. [1, 2,], it's better to report to the user because
302
            // this occurrence is common.
303
2108
            if reader.peek_if(|c| !is_whitespace(c)) == Some(']') {
304
5
                let kind = ParseErrorKind::Json(JsonErrorVariant::TrailingComma);
305
5
                return Err(ParseError::new(save.pos, false, kind));
306
            }
307
660
            let element = list_element(reader)?;
308
655
            elements.push(element);
309
        }
310
    }
311
335
    literal("]", reader)?;
312

            
313
335
    Ok(JsonValue::List { space0, elements })
314
}
315

            
316
965
fn list_element(reader: &mut Reader) -> ParseResult<JsonListElement> {
317
965
    let space0 = whitespace(reader);
318
965
    let value = parse_in_json(reader)?;
319
960
    let space1 = whitespace(reader);
320
960
    Ok(JsonListElement {
321
960
        space0,
322
960
        value,
323
960
        space1,
324
960
    })
325
}
326

            
327
25715
pub fn object_value(reader: &mut Reader) -> ParseResult<JsonValue> {
328
25715
    try_literal("{", reader)?;
329
750
    let space0 = whitespace(reader);
330
750
    let mut elements = vec![];
331
750
    if reader.peek() != Some('}') {
332
715
        let first_element = object_element(reader)?;
333
675
        elements.push(first_element);
334

            
335
        loop {
336
1790
            if reader.peek() == Some('}') {
337
670
                break;
338
            }
339
1120
            // Reports "expecting '}'" in case the user forgot to add the last '}', e.g
340
1120
            // `{"name": "abc"`
341
1120
            if reader.peek() != Some(',') {
342
                break;
343
            }
344
1120
            // The reader advances after literal(","), so this saves its position to report an
345
1120
            // error in case it happens.
346
1120
            let save = reader.cursor();
347
1120
            literal(",", reader)?;
348
            // If there is one more comma, e.g. {"a": "b",}, it's better to report to the user
349
            // because this occurrence is common.
350
7224
            if reader.peek_if(|c| !is_whitespace(c)) == Some('}') {
351
5
                let kind = ParseErrorKind::Json(JsonErrorVariant::TrailingComma);
352
5
                return Err(ParseError::new(save.pos, false, kind));
353
            }
354
1115
            let element = object_element(reader)?;
355
1115
            elements.push(element);
356
        }
357
    }
358

            
359
    // at least one element
360

            
361
705
    literal("}", reader)?;
362

            
363
705
    Ok(JsonValue::Object { space0, elements })
364
}
365

            
366
1830
fn key(reader: &mut Reader) -> ParseResult<Template> {
367
1830
    let name = string_template(reader).map_err(|e| e.to_non_recoverable())?;
368
1830
    Ok(name)
369
}
370

            
371
1830
fn object_element(reader: &mut Reader) -> ParseResult<JsonObjectElement> {
372
1830
    let space0 = whitespace(reader);
373
    //literal("\"", reader)?;
374
1830
    let name = key(reader)?;
375
    //literal("\"", reader)?;
376
1830
    let space1 = whitespace(reader);
377
1830
    literal(":", reader)?;
378
1830
    let save = reader.cursor();
379
1830
    let space2 = whitespace(reader);
380
1830
    // Checks if there is no element after ':'. In this case, a special error must be reported
381
1830
    // because this is a common occurrence.
382
1830
    let next_char = reader.peek();
383
1830
    // Comparing to None because `next_char` can be EOF.
384
1830
    if next_char == Some('}') || next_char.is_none() {
385
5
        let kind = ParseErrorKind::Json(JsonErrorVariant::EmptyElement);
386
5
        return Err(ParseError::new(save.pos, false, kind));
387
    }
388
1825
    let value = parse_in_json(reader)?;
389
1790
    let space3 = whitespace(reader);
390
1790
    Ok(JsonObjectElement {
391
1790
        space0,
392
1790
        name,
393
1790
        space1,
394
1790
        space2,
395
1790
        value,
396
1790
        space3,
397
1790
    })
398
}
399

            
400
35440
fn is_whitespace(c: char) -> bool {
401
35440
    c == ' ' || c == '\t' || c == '\n' || c == '\r'
402
}
403

            
404
10300
fn whitespace(reader: &mut Reader) -> String {
405
10300
    reader.read_while(is_whitespace)
406
}
407

            
408
#[cfg(test)]
409
mod tests {
410
    use super::*;
411
    use crate::ast::*;
412
    use crate::typing::ToSource;
413

            
414
    #[test]
415
    fn test_parse_error() {
416
        let mut reader = Reader::new("{ \"a\":\n}");
417
        let error = parse(&mut reader).err().unwrap();
418
        assert_eq!(error.pos, Pos { line: 1, column: 7 });
419
        assert_eq!(
420
            error.kind,
421
            ParseErrorKind::Json(JsonErrorVariant::EmptyElement)
422
        );
423
        assert!(!error.recoverable);
424

            
425
        let mut reader = Reader::new("[0,1,]");
426
        let error = parse(&mut reader).err().unwrap();
427
        assert_eq!(error.pos, Pos { line: 1, column: 5 });
428
        assert_eq!(
429
            error.kind,
430
            ParseErrorKind::Json(JsonErrorVariant::TrailingComma),
431
        );
432
        assert!(!error.recoverable);
433
    }
434

            
435
    #[test]
436
    fn test_null_value() {
437
        let mut reader = Reader::new("null");
438
        assert_eq!(null_value(&mut reader).unwrap(), JsonValue::Null);
439
        assert_eq!(reader.cursor().index, 4);
440

            
441
        let mut reader = Reader::new("true");
442
        let error = null_value(&mut reader).err().unwrap();
443
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
444
        assert_eq!(
445
            error.kind,
446
            ParseErrorKind::Expecting {
447
                value: "null".to_string()
448
            }
449
        );
450
        assert!(error.recoverable);
451
    }
452

            
453
    #[test]
454
    fn test_integer() {
455
        let mut reader = Reader::new("0");
456
        assert_eq!(integer(&mut reader).unwrap(), "0".to_string());
457
        assert_eq!(reader.cursor().index, 1);
458

            
459
        let mut reader = Reader::new("123");
460
        assert_eq!(integer(&mut reader).unwrap(), "123".to_string());
461
        assert_eq!(reader.cursor().index, 3);
462

            
463
        let mut reader = Reader::new("0123");
464
        assert_eq!(integer(&mut reader).unwrap(), "0".to_string());
465
        assert_eq!(reader.cursor().index, 1);
466
    }
467

            
468
    #[test]
469
    fn test_fraction() {
470
        let mut reader = Reader::new(".5");
471
        assert_eq!(fraction(&mut reader).unwrap(), ".5".to_string());
472
        assert_eq!(reader.cursor().index, 2);
473
    }
474

            
475
    #[test]
476
    fn test_exponent() {
477
        let mut reader = Reader::new("e2");
478
        assert_eq!(exponent(&mut reader).unwrap(), "e2".to_string());
479
        assert_eq!(reader.cursor().index, 2);
480
    }
481

            
482
    #[test]
483
    fn test_boolean_value() {
484
        let mut reader = Reader::new("true");
485
        assert_eq!(
486
            boolean_value(&mut reader).unwrap(),
487
            JsonValue::Boolean(true)
488
        );
489
        assert_eq!(reader.cursor().index, 4);
490

            
491
        let mut reader = Reader::new("1");
492
        let error = boolean_value(&mut reader).err().unwrap();
493
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
494
        assert_eq!(
495
            error.kind,
496
            ParseErrorKind::Expecting {
497
                value: "true|false".to_string()
498
            }
499
        );
500
        assert!(error.recoverable);
501
    }
502

            
503
    pub fn json_hello_world_value() -> JsonValue {
504
        // "hello\u0020{{name}}!"
505
        JsonValue::String(Template::new(
506
            Some('"'),
507
            vec![
508
                TemplateElement::String {
509
                    value: "Hello ".to_string(),
510
                    source: "Hello\\u0020".to_source(),
511
                },
512
                TemplateElement::Placeholder(Placeholder {
513
                    space0: Whitespace {
514
                        value: String::new(),
515
                        source_info: SourceInfo::new(Pos::new(1, 15), Pos::new(1, 15)),
516
                    },
517
                    expr: Expr {
518
                        kind: ExprKind::Variable(Variable {
519
                            name: "name".to_string(),
520
                            source_info: SourceInfo::new(Pos::new(1, 15), Pos::new(1, 19)),
521
                        }),
522
                        source_info: SourceInfo::new(Pos::new(1, 15), Pos::new(1, 19)),
523
                    },
524
                    space1: Whitespace {
525
                        value: String::new(),
526
                        source_info: SourceInfo::new(Pos::new(1, 19), Pos::new(1, 19)),
527
                    },
528
                }),
529
                TemplateElement::String {
530
                    value: "!".to_string(),
531
                    source: "!".to_source(),
532
                },
533
            ],
534
            SourceInfo::new(Pos::new(1, 2), Pos::new(1, 22)),
535
        ))
536
    }
537

            
538
    #[test]
539
    fn test_string_value() {
540
        let mut reader = Reader::new("\"\"");
541
        assert_eq!(
542
            string_value(&mut reader).unwrap(),
543
            JsonValue::String(Template::new(
544
                Some('"'),
545
                vec![],
546
                SourceInfo::new(Pos::new(1, 2), Pos::new(1, 2)),
547
            ))
548
        );
549
        assert_eq!(reader.cursor().index, 2);
550

            
551
        let mut reader = Reader::new("\"Hello\\u0020{{name}}!\"");
552
        assert_eq!(string_value(&mut reader).unwrap(), json_hello_world_value());
553
        assert_eq!(reader.cursor().index, 22);
554

            
555
        let mut reader = Reader::new("\"{}\"");
556
        assert_eq!(
557
            string_value(&mut reader).unwrap(),
558
            JsonValue::String(Template::new(
559
                Some('"'),
560
                vec![TemplateElement::String {
561
                    value: "{}".to_string(),
562
                    source: "{}".to_source(),
563
                }],
564
                SourceInfo::new(Pos::new(1, 2), Pos::new(1, 4)),
565
            ))
566
        );
567
        assert_eq!(reader.cursor().index, 4);
568
    }
569

            
570
    #[test]
571
    fn test_string_value_error() {
572
        let mut reader = Reader::new("1");
573
        let error = string_value(&mut reader).err().unwrap();
574
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
575
        assert_eq!(
576
            error.kind,
577
            ParseErrorKind::Expecting {
578
                value: "\"".to_string()
579
            }
580
        );
581
        assert!(error.recoverable);
582

            
583
        let mut reader = Reader::new("\"1");
584
        let error = string_value(&mut reader).err().unwrap();
585
        assert_eq!(error.pos, Pos { line: 1, column: 3 });
586
        assert_eq!(
587
            error.kind,
588
            ParseErrorKind::Expecting {
589
                value: "\"".to_string()
590
            }
591
        );
592
        assert!(!error.recoverable);
593

            
594
        let mut reader = Reader::new("\"{{x\"");
595
        let error = string_value(&mut reader).err().unwrap();
596
        assert_eq!(error.pos, Pos { line: 1, column: 5 });
597
        assert_eq!(
598
            error.kind,
599
            ParseErrorKind::Expecting {
600
                value: "}}".to_string()
601
            }
602
        );
603
        assert!(!error.recoverable);
604
    }
605

            
606
    #[test]
607
    fn test_any_char() {
608
        let mut reader = Reader::new("a");
609
        assert_eq!(
610
            any_char(&mut reader).unwrap(),
611
            ('a', "a".to_string(), Pos { line: 1, column: 1 })
612
        );
613
        assert_eq!(reader.cursor().index, 1);
614

            
615
        let mut reader = Reader::new(" ");
616
        assert_eq!(
617
            any_char(&mut reader).unwrap(),
618
            (' ', " ".to_string(), Pos { line: 1, column: 1 })
619
        );
620
        assert_eq!(reader.cursor().index, 1);
621

            
622
        let mut reader = Reader::new("\\u0020 ");
623
        assert_eq!(
624
            any_char(&mut reader).unwrap(),
625
            (' ', "\\u0020".to_string(), Pos { line: 1, column: 1 })
626
        );
627
        assert_eq!(reader.cursor().index, 6);
628

            
629
        let mut reader = Reader::new("\\t");
630
        assert_eq!(
631
            any_char(&mut reader).unwrap(),
632
            ('\t', "\\t".to_string(), Pos { line: 1, column: 1 })
633
        );
634
        assert_eq!(reader.cursor().index, 2);
635

            
636
        let mut reader = Reader::new("#");
637
        assert_eq!(
638
            any_char(&mut reader).unwrap(),
639
            ('#', "#".to_string(), Pos { line: 1, column: 1 })
640
        );
641
        assert_eq!(reader.cursor().index, 1);
642
    }
643

            
644
    #[test]
645
    fn test_any_char_error() {
646
        let mut reader = Reader::new("");
647
        let error = any_char(&mut reader).err().unwrap();
648
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
649
        assert!(error.recoverable);
650

            
651
        let mut reader = Reader::new("\t");
652
        let error = any_char(&mut reader).err().unwrap();
653
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
654
        assert!(error.recoverable);
655
    }
656

            
657
    #[test]
658
    fn test_escape_char() {
659
        let mut reader = Reader::new("\\n");
660
        assert_eq!(escape_char(&mut reader).unwrap(), '\n');
661
        assert_eq!(reader.cursor().index, 2);
662

            
663
        let mut reader = Reader::new("\\u000a");
664
        assert_eq!(escape_char(&mut reader).unwrap(), '\n');
665
        assert_eq!(reader.cursor().index, 6);
666

            
667
        let mut reader = Reader::new("x");
668
        let error = escape_char(&mut reader).err().unwrap();
669
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
670
        assert_eq!(
671
            error.kind,
672
            ParseErrorKind::Expecting {
673
                value: "\\".to_string()
674
            }
675
        );
676
        assert!(error.recoverable);
677
        assert_eq!(reader.cursor().index, 0);
678
    }
679

            
680
    #[test]
681
    fn test_unicode() {
682
        let mut reader = Reader::new("000a");
683
        assert_eq!(unicode(&mut reader).unwrap(), '\n');
684
        assert_eq!(reader.cursor().index, 4);
685

            
686
        let mut reader = Reader::new("c350");
687
        assert_eq!(unicode(&mut reader).unwrap(), '썐');
688
        assert_eq!(reader.cursor().index, 4);
689

            
690
        let mut reader = Reader::new("d83c\\udf78");
691
        assert_eq!(unicode(&mut reader).unwrap(), '🍸');
692
        assert_eq!(reader.cursor().index, 10);
693

            
694
        let mut reader = Reader::new("d800");
695
        let error = unicode(&mut reader).unwrap_err();
696
        assert_eq!(error.pos, Pos { line: 1, column: 5 });
697
        assert_eq!(
698
            error.kind,
699
            ParseErrorKind::Expecting {
700
                value: "\\u".to_string()
701
            }
702
        );
703
        assert!(!error.recoverable);
704

            
705
        let mut reader = Reader::new("d800\\ud800");
706
        let error = unicode(&mut reader).unwrap_err();
707
        assert_eq!(error.pos, Pos { line: 1, column: 7 });
708
        assert_eq!(error.kind, ParseErrorKind::Unicode);
709
        assert!(!error.recoverable);
710
    }
711

            
712
    #[test]
713
    fn test_hex_value() {
714
        let mut reader = Reader::new("0020x");
715
        assert_eq!(hex_value(&mut reader).unwrap(), 32);
716

            
717
        let mut reader = Reader::new("d800");
718
        assert_eq!(hex_value(&mut reader).unwrap(), 55296);
719

            
720
        let mut reader = Reader::new("x");
721
        let error = hex_value(&mut reader).unwrap_err();
722
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
723
        assert_eq!(error.kind, ParseErrorKind::HexDigit);
724
        assert!(!error.recoverable);
725
    }
726

            
727
    #[test]
728
    fn test_number_value() {
729
        let mut reader = Reader::new("100");
730
        assert_eq!(
731
            number_value(&mut reader).unwrap(),
732
            JsonValue::Number("100".to_string())
733
        );
734
        assert_eq!(reader.cursor().index, 3);
735

            
736
        let mut reader = Reader::new("1.333");
737
        assert_eq!(
738
            number_value(&mut reader).unwrap(),
739
            JsonValue::Number("1.333".to_string())
740
        );
741
        assert_eq!(reader.cursor().index, 5);
742

            
743
        let mut reader = Reader::new("-1");
744
        assert_eq!(
745
            number_value(&mut reader).unwrap(),
746
            JsonValue::Number("-1".to_string())
747
        );
748
        assert_eq!(reader.cursor().index, 2);
749

            
750
        let mut reader = Reader::new("00");
751
        assert_eq!(
752
            number_value(&mut reader).unwrap(),
753
            JsonValue::Number("0".to_string())
754
        );
755
        assert_eq!(reader.cursor().index, 1);
756

            
757
        let mut reader = Reader::new("1e0");
758
        assert_eq!(
759
            number_value(&mut reader).unwrap(),
760
            JsonValue::Number("1e0".to_string())
761
        );
762
        assert_eq!(reader.cursor().index, 3);
763

            
764
        let mut reader = Reader::new("1e005");
765
        assert_eq!(
766
            number_value(&mut reader).unwrap(),
767
            JsonValue::Number("1e005".to_string())
768
        );
769
        assert_eq!(reader.cursor().index, 5);
770

            
771
        let mut reader = Reader::new("1e-005");
772
        assert_eq!(
773
            number_value(&mut reader).unwrap(),
774
            JsonValue::Number("1e-005".to_string())
775
        );
776
        assert_eq!(reader.cursor().index, 6);
777
    }
778

            
779
    #[test]
780
    fn test_number_value_error() {
781
        let mut reader = Reader::new("true");
782
        let error = number_value(&mut reader).err().unwrap();
783
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
784
        assert_eq!(
785
            error.kind,
786
            ParseErrorKind::Expecting {
787
                value: "number".to_string()
788
            }
789
        );
790
        assert!(error.recoverable);
791

            
792
        let mut reader = Reader::new("1.x");
793
        let error = number_value(&mut reader).err().unwrap();
794
        assert_eq!(error.pos, Pos { line: 1, column: 3 });
795
        assert_eq!(
796
            error.kind,
797
            ParseErrorKind::Expecting {
798
                value: "digits".to_string()
799
            }
800
        );
801
        assert!(!error.recoverable);
802
    }
803

            
804
    #[test]
805
    fn test_expression_value() {
806
        let mut reader = Reader::new("{{n}}");
807
        assert_eq!(
808
            expression_value(&mut reader).unwrap(),
809
            JsonValue::Placeholder(Placeholder {
810
                space0: Whitespace {
811
                    value: String::new(),
812
                    source_info: SourceInfo::new(Pos::new(1, 3), Pos::new(1, 3))
813
                },
814
                expr: Expr {
815
                    kind: ExprKind::Variable(Variable {
816
                        name: "n".to_string(),
817
                        source_info: SourceInfo::new(Pos::new(1, 3), Pos::new(1, 4))
818
                    }),
819
                    source_info: SourceInfo::new(Pos::new(1, 3), Pos::new(1, 4))
820
                },
821
                space1: Whitespace {
822
                    value: String::new(),
823
                    source_info: SourceInfo::new(Pos::new(1, 4), Pos::new(1, 4))
824
                }
825
            })
826
        );
827
        assert_eq!(reader.cursor().index, 5);
828
    }
829

            
830
    #[test]
831
    fn test_list_value() {
832
        let mut reader = Reader::new("[]");
833
        assert_eq!(
834
            list_value(&mut reader).unwrap(),
835
            JsonValue::List {
836
                space0: String::new(),
837
                elements: vec![]
838
            }
839
        );
840
        assert_eq!(reader.cursor().index, 2);
841

            
842
        let mut reader = Reader::new("[ ]");
843
        assert_eq!(
844
            list_value(&mut reader).unwrap(),
845
            JsonValue::List {
846
                space0: " ".to_string(),
847
                elements: vec![]
848
            }
849
        );
850
        assert_eq!(reader.cursor().index, 3);
851

            
852
        let mut reader = Reader::new("[true, false]");
853
        assert_eq!(
854
            list_value(&mut reader).unwrap(),
855
            JsonValue::List {
856
                space0: String::new(),
857
                elements: vec![
858
                    JsonListElement {
859
                        space0: String::new(),
860
                        value: JsonValue::Boolean(true),
861
                        space1: String::new(),
862
                    },
863
                    JsonListElement {
864
                        space0: String::from(" "),
865
                        value: JsonValue::Boolean(false),
866
                        space1: String::new(),
867
                    }
868
                ],
869
            }
870
        );
871
        assert_eq!(reader.cursor().index, 13);
872
    }
873

            
874
    #[test]
875
    fn test_list_error() {
876
        let mut reader = Reader::new("true");
877
        let error = list_value(&mut reader).err().unwrap();
878
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
879
        assert_eq!(
880
            error.kind,
881
            ParseErrorKind::Expecting {
882
                value: "[".to_string()
883
            }
884
        );
885
        assert!(error.recoverable);
886

            
887
        let mut reader = Reader::new("[1, 2,]");
888
        let error = list_value(&mut reader).err().unwrap();
889
        assert_eq!(error.pos, Pos { line: 1, column: 6 });
890
        assert_eq!(
891
            error.kind,
892
            ParseErrorKind::Json(JsonErrorVariant::TrailingComma),
893
        );
894
        assert!(!error.recoverable);
895
    }
896

            
897
    #[test]
898
    fn test_list_element() {
899
        let mut reader = Reader::new("true");
900
        assert_eq!(
901
            list_element(&mut reader).unwrap(),
902
            JsonListElement {
903
                space0: String::new(),
904
                value: JsonValue::Boolean(true),
905
                space1: String::new(),
906
            }
907
        );
908
        assert_eq!(reader.cursor().index, 4);
909
    }
910

            
911
    #[test]
912
    fn test_object_value() {
913
        let mut reader = Reader::new("{}");
914
        assert_eq!(
915
            object_value(&mut reader).unwrap(),
916
            JsonValue::Object {
917
                space0: String::new(),
918
                elements: vec![]
919
            }
920
        );
921
        assert_eq!(reader.cursor().index, 2);
922

            
923
        let mut reader = Reader::new("{ }");
924
        assert_eq!(
925
            object_value(&mut reader).unwrap(),
926
            JsonValue::Object {
927
                space0: " ".to_string(),
928
                elements: vec![]
929
            }
930
        );
931
        assert_eq!(reader.cursor().index, 3);
932

            
933
        let mut reader = Reader::new("{\n  \"a\": true\n}");
934
        assert_eq!(
935
            object_value(&mut reader).unwrap(),
936
            JsonValue::Object {
937
                space0: "\n  ".to_string(),
938
                elements: vec![JsonObjectElement {
939
                    space0: String::new(),
940
                    name: Template::new(
941
                        Some('"'),
942
                        vec![TemplateElement::String {
943
                            value: "a".to_string(),
944
                            source: "a".to_source()
945
                        }],
946
                        SourceInfo::new(Pos::new(2, 4), Pos::new(2, 5))
947
                    ),
948
                    space1: String::new(),
949
                    space2: " ".to_string(),
950
                    value: JsonValue::Boolean(true),
951
                    space3: "\n".to_string(),
952
                }],
953
            }
954
        );
955
        assert_eq!(reader.cursor().index, 15);
956

            
957
        let mut reader = Reader::new("true");
958
        let error = object_value(&mut reader).err().unwrap();
959
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
960
        assert_eq!(
961
            error.kind,
962
            ParseErrorKind::Expecting {
963
                value: "{".to_string()
964
            }
965
        );
966
        assert!(error.recoverable);
967
    }
968

            
969
    #[test]
970
    fn test_object_error() {
971
        let mut reader = Reader::new("{ \"a\":\n}");
972
        let error = object_value(&mut reader).err().unwrap();
973
        assert_eq!(error.pos, Pos { line: 1, column: 7 });
974
        assert_eq!(
975
            error.kind,
976
            ParseErrorKind::Json(JsonErrorVariant::EmptyElement)
977
        );
978
        assert!(!error.recoverable);
979
    }
980

            
981
    #[test]
982
    fn test_object_element() {
983
        let mut reader = Reader::new("\"a\": true");
984
        assert_eq!(
985
            object_element(&mut reader).unwrap(),
986
            JsonObjectElement {
987
                space0: String::new(),
988
                name: Template::new(
989
                    Some('"'),
990
                    vec![TemplateElement::String {
991
                        value: "a".to_string(),
992
                        source: "a".to_source()
993
                    }],
994
                    SourceInfo::new(Pos::new(1, 2), Pos::new(1, 3))
995
                ),
996
                space1: String::new(),
997
                space2: " ".to_string(),
998
                value: JsonValue::Boolean(true),
999
                space3: String::new(),
            }
        );
        assert_eq!(reader.cursor().index, 9);
    }
    #[test]
    fn test_object_element_error() {
        let mut reader = Reader::new(":");
        let error = object_element(&mut reader).err().unwrap();
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
        assert_eq!(
            error.kind,
            ParseErrorKind::Expecting {
                value: "\"".to_string()
            }
        );
        assert!(!error.recoverable);
        let mut reader = Reader::new("\"name\":\n");
        let error = object_element(&mut reader).err().unwrap();
        assert_eq!(error.pos, Pos { line: 1, column: 8 });
        assert_eq!(
            error.kind,
            ParseErrorKind::Json(JsonErrorVariant::EmptyElement),
        );
        assert!(!error.recoverable);
    }
    #[test]
    fn test_whitespace() {
        let mut reader = Reader::new("");
        assert_eq!(whitespace(&mut reader), String::new());
        assert_eq!(reader.cursor().index, 0);
        let mut reader = Reader::new(" x");
        assert_eq!(whitespace(&mut reader), " ".to_string());
        assert_eq!(reader.cursor().index, 1);
        let mut reader = Reader::new("\n  x");
        assert_eq!(whitespace(&mut reader), "\n  ".to_string());
        assert_eq!(reader.cursor().index, 3);
    }
}