Actually just three programming languages in a trenchcoat
at main 52 lines 1.4 kB view raw
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}