use { crate::criteria::{ CritLiteralOrRegex, RootMatcherMap, crit_graph::{CritRootCriterion, CritTarget}, }, std::marker::PhantomData, }; pub struct CritMatchString { string: CritLiteralOrRegex, _phantom: PhantomData<(fn(&Target), A)>, } pub trait StringAccess: Sized + 'static where Target: CritTarget, { fn with_string(data: &Target, f: impl FnOnce(&str) -> bool) -> bool; fn nodes( roots: &Target::RootMatchers, ) -> &RootMatcherMap>; } impl CritMatchString { pub fn new(string: CritLiteralOrRegex) -> Self { Self { string, _phantom: Default::default(), } } } impl CritRootCriterion for CritMatchString where Target: CritTarget, A: StringAccess, { fn matches(&self, data: &Target) -> bool { A::with_string(data, |s| self.string.matches(s)) } fn nodes(roots: &Target::RootMatchers) -> Option<&RootMatcherMap> { Some(A::nodes(roots)) } }