Actually just three programming languages in a trenchcoat
1use super::*;
2use crate::{Parser, Spanned};
3use source_span::Span;
4use trilogy_scanner::{Token, TokenType};
5
6#[derive(Clone, Debug)]
7pub struct RestPattern {
8 pub rest: Token,
9 pub pattern: Option<Pattern>,
10 pub span: Span,
11}
12
13impl Spanned for RestPattern {
14 fn span(&self) -> Span {
15 self.span
16 }
17}
18
19impl RestPattern {
20 pub(crate) fn new(rest: Token, pattern: Pattern) -> Self {
21 Self {
22 span: rest.span.union(pattern.span()),
23 rest,
24 pattern: Some(pattern),
25 }
26 }
27
28 pub(crate) fn parse(parser: &mut Parser, rest: Token) -> SyntaxResult<Self> {
29 if parser
30 .check([
31 TokenType::OpComma,
32 TokenType::CBrack,
33 TokenType::CBracePipe,
34 TokenType::CBrackPipe,
35 ])
36 .is_ok()
37 {
38 return Ok(Self {
39 span: rest.span,
40 rest,
41 pattern: None,
42 });
43 }
44 let pattern = Pattern::parse(parser)?;
45 Ok(Self {
46 span: rest.span.union(pattern.span()),
47 rest,
48 pattern: Some(pattern),
49 })
50 }
51}
52
53impl TryFrom<(Token, Expression)> for RestPattern {
54 type Error = SyntaxError;
55
56 fn try_from((rest, val): (Token, Expression)) -> Result<Self, Self::Error> {
57 Ok(Self::new(rest, val.try_into()?))
58 }
59}