use predicates::{
reflection::{Case, PredicateReflection},
Predicate,
};
use std::fmt;
use crate::CapturedSpan;
pub fn name<P: Predicate<str>>(matches: P) -> NamePredicate<P> {
NamePredicate { matches }
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct NamePredicate<P> {
matches: P,
}
impl_bool_ops!(NamePredicate<P>);
impl<P: Predicate<str>> fmt::Display for NamePredicate<P> {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(formatter, "name({})", self.matches)
}
}
impl<P: Predicate<str>> PredicateReflection for NamePredicate<P> {}
impl<P: Predicate<str>> Predicate<CapturedSpan<'_>> for NamePredicate<P> {
fn eval(&self, variable: &CapturedSpan<'_>) -> bool {
self.matches.eval(variable.metadata().name())
}
fn find_case(&self, expected: bool, variable: &CapturedSpan<'_>) -> Option<Case<'_>> {
let child = self
.matches
.find_case(expected, variable.metadata().name())?;
Some(Case::new(Some(self), expected).add_child(child))
}
}