harper_core/patterns/
repeating_pattern.rsuse super::Pattern;
use crate::Token;
pub struct RepeatingPattern {
inner: Box<dyn Pattern>,
}
impl RepeatingPattern {
pub fn new(pattern: Box<dyn Pattern>) -> Self {
Self { inner: pattern }
}
}
impl Pattern for RepeatingPattern {
fn matches(&self, tokens: &[Token], source: &[char]) -> usize {
let mut tok_cursor = 0;
loop {
let match_len = self.inner.matches(&tokens[tok_cursor..], source);
if match_len == 0 {
return tok_cursor;
} else {
tok_cursor += match_len;
}
}
}
}
#[cfg(test)]
mod tests {
use super::RepeatingPattern;
use crate::patterns::{AnyPattern, Pattern};
use crate::Document;
#[test]
fn matches_anything() {
let doc = Document::new_plain_english_curated(
"This matcher will match the entirety of any document!",
);
let pat = RepeatingPattern::new(Box::new(AnyPattern));
assert_eq!(
pat.matches(doc.get_tokens(), doc.get_source()),
doc.get_tokens().len()
)
}
}