use crate::{Processor, Sink};
pub struct ProcessorBuilder {
pub transformer: Box<dyn FnMut(String) -> Option<String> + Send>,
}
impl Default for ProcessorBuilder {
fn default() -> Self {
ProcessorBuilder {
transformer: Box::new(|s| Some(s)),
}
}
}
impl ProcessorBuilder {
pub fn transformer(mut self, t: impl FnMut(String) -> Option<String> + Send + 'static) -> Self {
self.transformer = Box::new(t);
self
}
pub fn ignore(self, mut filter: impl FnMut(&str) -> bool + Send + 'static) -> Self {
self.transformer(move |s| if filter(&s) { None } else { Some(s) })
}
pub fn filter(self, mut filter: impl FnMut(&str) -> bool + Send + 'static) -> Self {
self.ignore(move |line| !filter(line))
}
pub fn sink(self, sink: Sink) -> Processor {
Processor {
transformer: self.transformer,
sink,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_transformer() {
let text = "test".to_string();
let mut processor = ProcessorBuilder::default();
let transformed = (processor.transformer)(text.clone());
assert_eq!(transformed, Some(text));
}
#[test]
fn ignore_filter() {
let text = "test".to_string();
let mut processor = ProcessorBuilder::default().ignore(|_| true);
let transformed = (processor.transformer)(text.clone());
assert_eq!(transformed, None);
let mut processor = ProcessorBuilder::default().ignore(|_| false);
let transformed = (processor.transformer)(text.clone());
assert_eq!(transformed, Some(text));
}
#[test]
fn filter_filter() {
let text = "test".to_string();
let mut processor = ProcessorBuilder::default().filter(|_| false);
let transformed = (processor.transformer)(text.clone());
assert_eq!(transformed, None);
let mut processor = ProcessorBuilder::default().filter(|_| true);
let transformed = (processor.transformer)(text.clone());
assert_eq!(transformed, Some(text));
}
}