harper_core/patterns/
either_pattern.rs

1use crate::Token;
2
3use super::Pattern;
4
5/// A pattern that returns the value of the longest match in a list.
6#[derive(Default)]
7pub struct EitherPattern {
8    patterns: Vec<Box<dyn Pattern>>,
9}
10
11impl EitherPattern {
12    pub fn new(patterns: Vec<Box<dyn Pattern>>) -> Self {
13        Self { patterns }
14    }
15
16    pub fn add(&mut self, pattern: Box<dyn Pattern>) {
17        self.patterns.push(pattern);
18    }
19}
20
21impl Pattern for EitherPattern {
22    fn matches(&self, tokens: &[Token], source: &[char]) -> Option<usize> {
23        let mut longest = None;
24
25        for pattern in self.patterns.iter() {
26            let Some(match_len) = pattern.matches(tokens, source) else {
27                continue;
28            };
29
30            if let Some(longest_len) = longest {
31                if match_len > longest_len {
32                    longest = Some(match_len);
33                }
34            } else {
35                longest = Some(match_len);
36            }
37        }
38
39        longest
40    }
41}