harper_core/expr/
longest_match_of.rs1use crate::{Span, Token, expr::Expr};
2
3#[derive(Default)]
5pub struct LongestMatchOf {
6 exprs: Vec<Box<dyn Expr>>,
7}
8
9impl LongestMatchOf {
10 pub fn new(exprs: Vec<Box<dyn Expr>>) -> Self {
11 Self { exprs }
12 }
13
14 pub fn add(&mut self, expr: impl Expr + 'static) {
15 self.exprs.push(Box::new(expr));
16 }
17}
18
19impl Expr for LongestMatchOf {
20 fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option<Span<Token>> {
21 let mut longest: Option<Span<Token>> = None;
22
23 for expr in self.exprs.iter() {
24 let Some(window) = expr.run(cursor, tokens, source) else {
25 continue;
26 };
27
28 if let Some(longest_window) = longest {
29 if window.len() > longest_window.len() {
30 longest = Some(window);
31 }
32 } else {
33 longest = Some(window);
34 }
35 }
36
37 longest
38 }
39}