aiken_lang/parser/expr/
tuple.rs

1use chumsky::prelude::*;
2
3use crate::{
4    expr::UntypedExpr,
5    parser::{error::ParseError, token::Token},
6};
7
8pub fn parser(
9    r: Recursive<'_, Token, UntypedExpr, ParseError>,
10) -> impl Parser<Token, UntypedExpr, Error = ParseError> + '_ {
11    r.clone()
12        .separated_by(just(Token::Comma))
13        .at_least(2)
14        .allow_trailing()
15        .delimited_by(
16            choice((just(Token::LeftParen), just(Token::NewLineLeftParen))),
17            just(Token::RightParen),
18        )
19        .map_with_span(|elems, span| UntypedExpr::Tuple {
20            location: span,
21            elems,
22        })
23}
24
25#[cfg(test)]
26mod tests {
27    use crate::assert_expr;
28
29    #[test]
30    fn parse_tuple() {
31        assert_expr!(
32            r#"
33            let tuple = (1, 2, 3, 4)
34            tuple.1st + tuple.2nd + tuple.3rd + tuple.4th
35            "#
36        );
37    }
38
39    #[test]
40    fn parse_tuple2() {
41        assert_expr!(
42            r#"
43            let a = foo(14)
44            (a, 42)
45            "#
46        );
47    }
48}