diff --git a/src/filter_plugin/grep.rs b/src/filter_plugin/grep.rs index 806b063..6e230a9 100644 --- a/src/filter_plugin/grep.rs +++ b/src/filter_plugin/grep.rs @@ -17,9 +17,9 @@ impl GrepFilter { } impl FilterPlugin for GrepFilter { - fn filter(&mut self, reader: &mut R, writer: &mut W) -> Result<()> { - let buf_reader = std::io::BufReader::new(reader); - for line in buf_reader.lines() { + fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> { + let mut buf_reader = std::io::BufReader::new(reader); + for line in buf_reader.by_ref().lines() { let line = line?; if self.regex.is_match(&line) { writeln!(writer, "{}", line)?; diff --git a/src/filter_plugin/mod.rs b/src/filter_plugin/mod.rs index 83ef0a1..2d1a43f 100644 --- a/src/filter_plugin/mod.rs +++ b/src/filter_plugin/mod.rs @@ -1,5 +1,4 @@ use std::io::{Result, Read, Write}; -use std::io::BufRead; pub mod head; pub mod tail; @@ -9,7 +8,7 @@ pub mod strip_ansi; pub mod utils; pub trait FilterPlugin: Send { - fn filter(&mut self, reader: &mut R, writer: &mut W) -> Result<()>; + fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()>; } pub struct FilterChain { @@ -27,7 +26,7 @@ impl FilterChain { self.plugins.push(plugin); } - pub fn filter(&mut self, reader: &mut R, writer: &mut W) -> Result<()> { + pub fn filter(&mut self, reader: &mut dyn Read, writer: &mut dyn Write) -> Result<()> { if self.plugins.is_empty() { // If no plugins, just copy the input to output std::io::copy(reader, writer)?; @@ -40,15 +39,17 @@ impl FilterChain { std::io::copy(reader, &mut current_data)?; for (i, plugin) in self.plugins.iter_mut().enumerate() { - let mut input = std::io::Cursor::new(¤t_data); + let mut input: Box<&mut dyn Read> = Box::new(&mut std::io::Cursor::new(¤t_data)); // For the last plugin, write directly to the output writer if i == self.plugins.len() - 1 { - plugin.filter(&mut input, writer)?; + let mut output: Box<&mut dyn Write> = Box::new(writer); + plugin.filter(input, output)?; } else { // For intermediate plugins, write to a buffer let mut output = Vec::new(); - plugin.filter(&mut input, &mut output)?; + let mut output_ref: Box<&mut dyn Write> = Box::new(&mut output); + plugin.filter(input, output_ref)?; current_data = output; } } diff --git a/src/filter_plugin/strip_ansi.rs b/src/filter_plugin/strip_ansi.rs index 0e70f15..5c2202d 100644 --- a/src/filter_plugin/strip_ansi.rs +++ b/src/filter_plugin/strip_ansi.rs @@ -11,9 +11,9 @@ impl StripAnsiFilter { } impl FilterPlugin for StripAnsiFilter { - fn filter(&mut self, reader: &mut R, writer: &mut W) -> Result<()> { + fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> { let mut ansi_writer = Writer::new(writer); - std::io::copy(reader, &mut ansi_writer)?; + std::io::copy(&mut *reader, &mut ansi_writer)?; ansi_writer.flush() } }