use std::fmt;
use crate::arguments::{ArgumentScanner, ExpectArg, FromArgs};
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct Filter<S = String> {
pub src: S,
pub dest: Option<S>,
pub name: S,
pub proc: u32,
}
impl<S> Filter<S> {
pub fn map_text<T, F>(self, mut f: F) -> Filter<T>
where
F: FnMut(S) -> T,
{
Filter {
src: f(self.src),
dest: self.dest.map(&mut f),
name: f(self.name),
proc: self.proc,
}
}
}
impl_into_owned!(Filter);
impl<S: AsRef<str>> Filter<S> {
pub fn borrow_text(&self) -> Filter<&str> {
Filter {
src: self.src.as_ref(),
dest: self.dest.as_ref().map(AsRef::as_ref),
name: self.name.as_ref(),
proc: self.proc,
}
}
}
impl_partial_eq!(Filter);
impl<'a, S: AsRef<str>> FromArgs<'a, S> for Filter<S> {
fn from_args<A: ArgumentScanner<'a, Decoded = S>>(mut scanner: A) -> crate::Result<Self> {
let src = scanner.get_next_or("src")?.expect_some("src")?;
let dest = scanner.get_next_or("dest")?;
let name = scanner.get_next_or("name")?.expect_some("name")?;
let proc = scanner.get_next_or("proc")?.expect_number()?.unwrap_or(0);
scanner.expect_end()?;
Ok(Self {
src,
dest,
name,
proc,
})
}
}
impl_from_str!(Filter);
impl<S: AsRef<str>> fmt::Display for Filter<S> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let Filter {
src,
dest,
name,
proc,
} = self.borrow_text();
crate::display::ElementFormatter {
name: "FILTER",
arguments: &[&src, &dest, &name, &(proc, 0)],
keywords: &[],
}
.fmt(f)
}
}