harper_core/expr/
first_match_of.rs1use super::{AsBoxedExpr, Expr};
2use crate::{Span, Token};
3
4#[derive(Default)]
9pub struct FirstMatchOf {
10 exprs: Vec<Box<dyn Expr>>,
11}
12
13impl FirstMatchOf {
14 pub fn new(exprs: impl IntoIterator<Item = impl AsBoxedExpr>) -> Self {
15 Self {
16 exprs: exprs.into_iter().map(|e| e.into_boxed_expr()).collect(),
17 }
18 }
19
20 pub fn add(&mut self, expr: impl Expr + 'static) {
21 self.exprs.push(Box::new(expr));
22 }
23
24 pub fn add_boxed(&mut self, expr: Box<dyn Expr>) {
25 self.exprs.push(expr);
26 }
27}
28
29impl Expr for FirstMatchOf {
30 fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option<Span<Token>> {
31 self.exprs
32 .iter()
33 .find_map(|p| p.run(cursor, tokens, source))
34 }
35}