//! Execution engine bits. use crate::api::Match; use crate::insn::CompiledRegex; use crate::position::PositionType; /// A trait for finding the next match in a regex. /// This is broken out from Executor to avoid needing to thread lifetimes /// around. pub trait MatchProducer: core::fmt::Debug { /// The position type of our indexer. type Position: PositionType; /// \return an initial position for the given start offset. fn initial_position(&self, offset: usize) -> Option; /// Attempt to match at the given location. /// \return either the Match and the position to start looking for the next /// match, or None on failure. fn next_match( &mut self, pos: Self::Position, next_start: &mut Option, ) -> Option; } /// A trait for executing a regex. pub trait Executor<'r, 't>: MatchProducer { /// The ASCII variant. type AsAscii: Executor<'r, 't>; /// Construct a new Executor. fn new(re: &'r CompiledRegex, text: &'t str) -> Self; } /// A struct which enables iteration over matches. #[derive(Debug)] pub struct Matches { mp: Producer, position: Option, } impl Matches { pub fn new(mp: Producer, start: usize) -> Self { let position = mp.initial_position(start); Matches { mp, position } } } impl Iterator for Matches { type Item = Match; fn next(&mut self) -> Option { let pos = self.position?; self.mp.next_match(pos, &mut self.position) } }