pub mod builder;
pub mod eval;
pub mod filtered;
mod lexer;
pub mod nodes;
pub mod parser;
pub mod path;
pub mod resolver;
pub use builder::{FilterBuilder, HasTerm, IntoFilterPath, NeedsTerm};
pub use eval::Eval;
pub use filtered::{Filtered, ListFiltered};
pub use resolver::PathResolver;
use nodes::*;
use parser::Parser;
use std::{
fmt::{Display, Formatter},
io::Cursor,
};
use self::eval::EvalContext;
#[derive(PartialEq, PartialOrd, Clone, Debug)]
pub struct Filter {
pub or: Or,
}
impl TryFrom<&str> for Filter {
type Error = std::io::Error;
fn try_from(data: &str) -> Result<Self, Self::Error> {
let mut input = Cursor::new(data.as_bytes());
let mut parser = Parser::make(&mut input)?;
Ok(Self {
or: parser.parse()?,
})
}
}
impl Eval for Filter {
fn eval<R: PathResolver>(&self, context: &EvalContext<R>) -> bool {
self.or.eval(context)
}
}
impl Display for Filter {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
self.or.fmt(f)
}
}
impl Visitable for Filter {
fn accept_visitor(&self, visitor: &mut impl Visitor) {
self.or.accept_visitor(visitor);
}
}