// Copyright (c) 2018 The predicates-rs Project Developers. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. //! Name predicate expressions. use std::fmt; use std::marker::PhantomData; use crate::reflection; use crate::Predicate; /// Augment an existing predicate with a name. /// /// This is created by the `PredicateNameExt::name` function. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct NamePredicate where M: Predicate, Item: ?Sized, { inner: M, name: &'static str, _phantom: PhantomData, } unsafe impl Send for NamePredicate where M: Predicate + Send, Item: ?Sized, { } unsafe impl Sync for NamePredicate where M: Predicate + Sync, Item: ?Sized, { } impl Predicate for NamePredicate where M: Predicate, Item: ?Sized, { fn eval(&self, item: &Item) -> bool { self.inner.eval(item) } fn find_case<'a>(&'a self, expected: bool, variable: &Item) -> Option> { self.inner .find_case(expected, variable) .map(|child_case| reflection::Case::new(Some(self), expected).add_child(child_case)) } } impl reflection::PredicateReflection for NamePredicate where M: Predicate, Item: ?Sized, { fn children<'a>(&'a self) -> Box> + 'a> { let params = vec![reflection::Child::new(self.name, &self.inner)]; Box::new(params.into_iter()) } } impl fmt::Display for NamePredicate where M: Predicate, Item: ?Sized, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let palette = crate::Palette::new(f.alternate()); write!(f, "{}", palette.description(self.name)) } } /// `Predicate` extension that adds naming predicate expressions. pub trait PredicateNameExt where Self: Predicate, { /// Name a predicate expression. /// /// # Examples /// /// ``` /// use predicates::prelude::*; /// /// let predicate_fn = predicate::str::is_empty().not().name("non-empty"); /// println!("{}", predicate_fn); /// ``` fn name(self, name: &'static str) -> NamePredicate where Self: Sized, { NamePredicate { inner: self, name, _phantom: PhantomData, } } } impl PredicateNameExt for P where P: Predicate, Item: ?Sized, { }