aiken_lang/parser/expr/
tuple.rs1use 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}