aiken_lang/parser/pattern/
var.rs1use 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}