1
/*
2
 * Hurl (https://hurl.dev)
3
 * Copyright (C) 2024 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 crate::ast::*;
19
use crate::combinator::choice;
20
use crate::parser::multiline::multiline_string;
21
use crate::parser::number::number;
22
use crate::parser::primitives::*;
23
use crate::parser::string::*;
24
use crate::parser::{expr, ParseError, ParseErrorKind, ParseResult};
25
use crate::reader::Reader;
26

            
27
15530
pub fn predicate_value(reader: &mut Reader) -> ParseResult<PredicateValue> {
28
15530
    choice(
29
15530
        &[
30
18636
            |p1| match null(p1) {
31
110
                Ok(()) => Ok(PredicateValue::Null),
32
15420
                Err(e) => Err(e),
33
18636
            },
34
18614
            |p1| match boolean(p1) {
35
240
                Ok(value) => Ok(PredicateValue::Bool(value)),
36
15180
                Err(e) => Err(e),
37
18614
            },
38
18566
            |p1| match number(p1) {
39
3820
                Ok(value) => Ok(PredicateValue::Number(value)),
40
11360
                Err(e) => Err(e),
41
18566
            },
42
17802
            |p1| match file(p1) {
43
55
                Ok(value) => Ok(PredicateValue::File(value)),
44
11305
                Err(e) => Err(e),
45
17802
            },
46
17791
            |p1| match hex(p1) {
47
910
                Ok(value) => Ok(PredicateValue::Hex(value)),
48
10395
                Err(e) => Err(e),
49
17791
            },
50
17609
            |p1| match base64(p1) {
51
35
                Ok(value) => Ok(PredicateValue::Base64(value)),
52
10360
                Err(e) => Err(e),
53
17609
            },
54
17602
            |p1| match expr::parse(p1) {
55
455
                Ok(value) => Ok(PredicateValue::Expression(value)),
56
9905
                Err(e) => Err(e),
57
17602
            },
58
17511
            |p1| match quoted_template(p1) {
59
9530
                Ok(value) => Ok(PredicateValue::String(value)),
60
375
                Err(e) => Err(e),
61
17511
            },
62
15603
            |p1| match multiline_string(p1) {
63
155
                Ok(value) => Ok(PredicateValue::MultilineString(value)),
64
210
                Err(e) => Err(e),
65
15603
            },
66
15572
            |p1| match regex(p1) {
67
200
                Ok(value) => Ok(PredicateValue::Regex(value)),
68
10
                Err(e) => Err(e),
69
15572
            },
70
15530
        ],
71
15530
        reader,
72
15530
    )
73
15534
    .map_err(|e| {
74
20
        let kind = if e.recoverable {
75
5
            ParseErrorKind::PredicateValue
76
        } else {
77
15
            e.kind
78
        };
79
20
        ParseError::new(e.pos, false, kind)
80
15534
    })
81
}
82

            
83
#[cfg(test)]
84
mod tests {
85

            
86
    use super::*;
87
    use crate::parser::ParseErrorKind;
88
    use crate::reader::Pos;
89

            
90
    #[test]
91
    fn test_predicate_value() {
92
        let mut reader = Reader::new("true");
93
        assert_eq!(
94
            predicate_value(&mut reader).unwrap(),
95
            PredicateValue::Bool(true)
96
        );
97

            
98
        let mut reader = Reader::new("1");
99
        assert_eq!(
100
            predicate_value(&mut reader).unwrap(),
101
            PredicateValue::Number(Number::Integer(1))
102
        );
103

            
104
        let mut reader = Reader::new("1.1");
105
        assert_eq!(
106
            predicate_value(&mut reader).unwrap(),
107
            PredicateValue::Number(Number::Float(Float {
108
                value: 1.1,
109
                encoded: "1.1".to_string(),
110
            }))
111
        );
112
    }
113

            
114
    #[test]
115
    fn test_predicate_value_error() {
116
        let mut reader = Reader::new("xx");
117
        let error = predicate_value(&mut reader).err().unwrap();
118
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
119
        assert_eq!(error.kind, ParseErrorKind::PredicateValue);
120
        assert!(!error.recoverable);
121
    }
122

            
123
    #[test]
124
    fn test_predicate_value_error_missing_quote() {
125
        let mut reader = Reader::new("\"not_found");
126
        let error = predicate_value(&mut reader).err().unwrap();
127
        assert_eq!(
128
            error.pos,
129
            Pos {
130
                line: 1,
131
                column: 11
132
            }
133
        );
134
        assert_eq!(
135
            error.kind,
136
            ParseErrorKind::Expecting {
137
                value: "\"".to_string()
138
            }
139
        );
140
        assert!(!error.recoverable);
141
    }
142
}