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 StructPattern {
8 pub atom: AtomLiteral,
9 pub open_paren: Token,
10 pub pattern: Pattern,
11 pub close_paren: Token,
12 pub span: Span,
13}
14
15impl Spanned for StructPattern {
16 fn span(&self) -> Span {
17 self.span
18 }
19}
20
21impl StructPattern {
22 pub(crate) fn parse(parser: &mut Parser, atom: AtomLiteral) -> SyntaxResult<Self> {
23 let open_paren = parser
24 .expect(OParen)
25 .map_err(|token| parser.expected(token, "expected `(`"))?;
26 let pattern = Pattern::parse(parser)?;
27 let close_paren = parser
28 .expect(CParen)
29 .map_err(|token| parser.expected(token, "expected `)`"))?;
30 Ok(Self {
31 span: atom.span().union(close_paren.span),
32 atom,
33 open_paren,
34 pattern,
35 close_paren,
36 })
37 }
38}
39
40impl TryFrom<StructLiteral> for StructPattern {
41 type Error = SyntaxError;
42
43 fn try_from(value: StructLiteral) -> Result<Self, Self::Error> {
44 Ok(Self {
45 span: value.atom.span().union(value.close_paren.span),
46 atom: value.atom,
47 open_paren: value.open_paren,
48 pattern: value.value.try_into()?,
49 close_paren: value.close_paren,
50 })
51 }
52}