Actually just three programming languages in a trenchcoat
at main 42 lines 1.0 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 WhenHandler { 8 pub when: Token, 9 pub pattern: Pattern, 10 pub guard: Option<Expression>, 11 pub strategy: HandlerStrategy, 12 pub span: Span, 13} 14 15impl WhenHandler { 16 pub(crate) fn parse(parser: &mut Parser) -> SyntaxResult<Self> { 17 let when = parser 18 .expect(KwWhen) 19 .expect("Caller should have found this"); 20 let pattern = Pattern::parse(parser)?; 21 let guard = parser 22 .expect(KwIf) 23 .ok() 24 .map(|_| Expression::parse(parser)) 25 .transpose()?; 26 let strategy = HandlerStrategy::parse(parser)?; 27 28 Ok(Self { 29 span: when.span.union(strategy.span()), 30 when, 31 guard, 32 pattern, 33 strategy, 34 }) 35 } 36} 37 38impl Spanned for WhenHandler { 39 fn span(&self) -> Span { 40 self.span 41 } 42}