harper_core/patterns/
either_pattern.rs1use crate::Token;
2
3use super::Pattern;
4
5#[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}