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 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}