rustre_parser/parser/
expression_by_names.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use super::*;

pub fn parse_call_by_name_expression<'slice, 'src>(
    input: Input<'slice, 'src>,
) -> IResult<'slice, 'src> {
    expression::expr_node(
        CallByNameExpressionNode,
        join((
            ident::parse_id_any,
            many_delimited(
                join((
                    t(OpenBrace),
                    opt(join((
                        expect(ident::parse_id_any, "expected ident before `with`"),
                        t(With),
                    ))),
                )),
                parse_call_by_name_param,
                alt((t(Semicolon), t(Comma))),
                join((opt(t(Semicolon)), t(CloseBrace))),
            ),
        )),
    )(input)
}

pub fn parse_call_by_name_param<'slice, 'src>(input: Input<'slice, 'src>) -> IResult<'slice, 'src> {
    node(
        CallByNameParamNode,
        alt((
            join((
                ident::parse_id_any,
                expect(
                    join((t(Equal), expression::parse_expression)),
                    "expected `= <value>` after field name",
                ),
            )),
            join((
                expect(ident::parse_id_any, "expected field name"),
                t(Equal),
                expect(expression::parse_expression, "expected value"),
            )),
        )),
    )(input)
}