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]) -> usize {
23        let mut longest = 0;
24
25        for pattern in self.patterns.iter() {
26            let match_len = pattern.matches(tokens, source);
27
28            if match_len > longest {
29                longest = match_len
30            }
31        }
32
33        longest
34    }
35}