Skip to main content

aiken_lang/parser/pattern/
var.rs

1use chumsky::prelude::*;
2
3use super::constructor;
4use crate::{
5    ast::UntypedPattern,
6    parser::{error::ParseError, token::Token},
7};
8
9pub fn parser(
10    expression: Recursive<'_, Token, UntypedPattern, ParseError>,
11) -> impl Parser<Token, UntypedPattern, Error = ParseError> + '_ {
12    select! {
13        Token::Name {name} => name,
14    }
15    .then(
16        just(Token::Dot)
17            .ignore_then(
18                select! { Token::UpName { name } => name }.then(constructor::args(expression)),
19            )
20            .or_not(),
21    )
22    .map_with_span(|(name, opt_pattern), span| {
23        if let Some((c_name, (arguments, spread_location, is_record))) = opt_pattern {
24            UntypedPattern::Constructor {
25                is_record,
26                location: span,
27                name: c_name,
28                arguments,
29                module: Some(crate::ast::Namespace::Module(name)),
30                constructor: (),
31                spread_location,
32                tipo: (),
33            }
34        } else {
35            UntypedPattern::Var {
36                location: span,
37                name,
38            }
39        }
40    })
41}