1use crate::data::{ast::*, tokens::*};
2use crate::error_format::{gen_nom_failure, ERROR_RIGHT_BRACKET};
3use crate::parser::{
4 operator::parse_operator,
5 parse_comments::comment,
6 parse_functions::parse_functions,
7 parse_idents::{parse_idents_as, parse_idents_assignation, parse_idents_utilisation},
8 parse_literal::parse_literal_expr,
9 parse_object::parse_object,
10 parse_parenthesis::parse_r_parentheses,
11 parse_path::parse_path,
12 parse_string::parse_string,
13 tools::*,
14};
15
16use nom::{
17 branch::alt,
18 bytes::complete::tag,
19 combinator::{cut, opt},
20 error::ParseError,
21 multi::separated_list,
22 sequence::{delimited, preceded, terminated, tuple},
23 Err, IResult,
24};
25
26fn parse_r_bracket<'a, E>(s: Span<'a>) -> IResult<Span<'a>, Span<'a>, E>
31where
32 E: ParseError<Span<'a>>,
33{
34 match tag(R_BRACKET)(s) {
35 Ok((rest, val)) => Ok((rest, val)),
36 Err(Err::Error((s, _err))) | Err(Err::Failure((s, _err))) => {
37 Err(gen_nom_failure(s, ERROR_RIGHT_BRACKET))
38 }
39 Err(Err::Incomplete(needed)) => Err(Err::Incomplete(needed)),
40 }
41}
42
43fn parse_condition_group<'a, E: ParseError<Span<'a>>>(s: Span<'a>) -> IResult<Span<'a>, Expr, E>
44where
45 E: ParseError<Span<'a>>,
46{
47 delimited(
48 preceded(comment, tag(L_PAREN)),
49 parse_operator,
50 preceded(comment, parse_r_parentheses),
51 )(s)
52}
53
54fn parse_idents_expr_utilisation<'a, E>(s: Span<'a>) -> IResult<Span<'a>, Expr, E>
55where
56 E: ParseError<Span<'a>>,
57{
58 let (s, idents) = parse_idents_utilisation(s)?;
59 Ok((s, Expr::IdentExpr(idents)))
60}
61
62fn parse_assignation_without_path<'a, E>(s: Span<'a>) -> IResult<Span<'a>, Expr, E>
63where
64 E: ParseError<Span<'a>>,
65{
66 let (s, name) = parse_idents_assignation(s)?;
67 let (s, _) = preceded(comment, tag(ASSIGN))(s)?;
68 let (s, expr) = preceded(comment, parse_operator)(s)?;
69
70 Ok((
71 s,
72 Expr::ObjectExpr(ObjectType::Assign(
73 Box::new(Expr::IdentExpr(name)),
74 Box::new(expr),
75 )),
76 ))
77}
78
79pub fn parse_expr_list<'a, E>(s: Span<'a>) -> IResult<Span<'a>, Expr, E>
84where
85 E: ParseError<Span<'a>>,
86{
87 let (s, start) = preceded(comment, get_interval)(s)?;
88 let (s, (vec, _)) = preceded(
89 tag(L_PAREN),
90 cut(terminated(
91 tuple((
92 separated_list(
93 preceded(comment, tag(COMMA)),
94 alt((parse_assignation_without_path, parse_operator)),
95 ),
96 opt(preceded(comment, tag(COMMA))),
97 )),
98 preceded(comment, parse_r_parentheses),
99 )),
100 )(s)?;
101 let (s, end) = get_interval(s)?;
102
103 Ok((s, Expr::VecExpr(vec, RangeInterval { start, end })))
104}
105
106pub fn parse_expr_array<'a, E>(s: Span<'a>) -> IResult<Span<'a>, Expr, E>
107where
108 E: ParseError<Span<'a>>,
109{
110 let (s, start) = preceded(comment, get_interval)(s)?;
111 let (s, (vec, _)) = preceded(
112 tag(L_BRACKET),
113 cut(terminated(
114 tuple((
115 separated_list(preceded(comment, tag(COMMA)), parse_operator),
116 opt(preceded(comment, tag(COMMA))),
117 )),
118 preceded(comment, parse_r_bracket),
119 )),
120 )(s)?;
121 let (s, end) = get_interval(s)?;
122
123 Ok((s, Expr::VecExpr(vec, RangeInterval { start, end })))
124}
125
126pub fn parse_basic_expr<'a, E>(s: Span<'a>) -> IResult<Span<'a>, Expr, E>
127where
128 E: ParseError<Span<'a>>,
129{
130 let (s, expr) = preceded(
131 comment,
132 alt((
133 parse_condition_group,
134 parse_object,
135 parse_expr_array,
136 parse_literal_expr,
137 parse_functions,
138 parse_string,
139 parse_idents_expr_utilisation,
140 )),
141 )(s)?;
142
143 let (s, expr) = parse_path(s, expr)?;
144
145 parse_idents_as(s, expr)
146}