diff --git a/src/filter_plugin/grep.rs b/src/filter_plugin/grep.rs index 6e230a9..b7e3fe1 100644 --- a/src/filter_plugin/grep.rs +++ b/src/filter_plugin/grep.rs @@ -17,7 +17,7 @@ impl GrepFilter { } impl FilterPlugin for GrepFilter { - fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> { + fn filter(&mut self, mut reader: Box<&mut dyn Read>, mut 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?; diff --git a/src/filter_plugin/head.rs b/src/filter_plugin/head.rs index efdc7e0..4be6f2b 100644 --- a/src/filter_plugin/head.rs +++ b/src/filter_plugin/head.rs @@ -15,7 +15,7 @@ impl HeadBytesFilter { } impl FilterPlugin for HeadBytesFilter { - fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> { + fn filter(&mut self, mut reader: Box<&mut dyn Read>, mut writer: Box<&mut dyn Write>) -> Result<()> { if self.remaining == 0 { return Ok(()); } @@ -47,7 +47,7 @@ impl HeadLinesFilter { } impl FilterPlugin for HeadLinesFilter { - fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> { + fn filter(&mut self, mut reader: Box<&mut dyn Read>, mut writer: Box<&mut dyn Write>) -> Result<()> { if self.remaining == 0 { return Ok(()); } diff --git a/src/filter_plugin/mod.rs b/src/filter_plugin/mod.rs index 2d1a43f..6ec4efa 100644 --- a/src/filter_plugin/mod.rs +++ b/src/filter_plugin/mod.rs @@ -8,7 +8,7 @@ pub mod strip_ansi; pub mod utils; pub trait FilterPlugin: Send { - fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()>; + fn filter(&mut self, mut reader: Box<&mut dyn Read>, mut writer: Box<&mut dyn Write>) -> Result<()>; } pub struct FilterChain { @@ -38,18 +38,23 @@ impl FilterChain { let mut current_data = Vec::new(); std::io::copy(reader, &mut current_data)?; - for (i, plugin) in self.plugins.iter_mut().enumerate() { - let mut input: Box<&mut dyn Read> = Box::new(&mut std::io::Cursor::new(¤t_data)); + // Store the plugins length to avoid borrowing issues + let plugins_len = self.plugins.len(); + + for i in 0..plugins_len { + // Create a cursor for the current data + let mut cursor = std::io::Cursor::new(¤t_data); + let mut input: Box<&mut dyn Read> = Box::new(&mut cursor); // For the last plugin, write directly to the output writer - if i == self.plugins.len() - 1 { + if i == plugins_len - 1 { let mut output: Box<&mut dyn Write> = Box::new(writer); - plugin.filter(input, output)?; + self.plugins[i].filter(input, output)?; } else { // For intermediate plugins, write to a buffer let mut output = Vec::new(); let mut output_ref: Box<&mut dyn Write> = Box::new(&mut output); - plugin.filter(input, output_ref)?; + self.plugins[i].filter(input, output_ref)?; current_data = output; } } diff --git a/src/filter_plugin/skip.rs b/src/filter_plugin/skip.rs index 46b2dfb..07c2b2f 100644 --- a/src/filter_plugin/skip.rs +++ b/src/filter_plugin/skip.rs @@ -15,7 +15,7 @@ impl SkipBytesFilter { } impl FilterPlugin for SkipBytesFilter { - fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> { + fn filter(&mut self, mut reader: Box<&mut dyn Read>, mut writer: Box<&mut dyn Write>) -> Result<()> { // Skip bytes in chunks if self.remaining > 0 { let mut buffer = vec![0; PIPESIZE]; @@ -48,7 +48,7 @@ impl SkipLinesFilter { } impl FilterPlugin for SkipLinesFilter { - fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> { + fn filter(&mut self, mut reader: Box<&mut dyn Read>, mut 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?; diff --git a/src/filter_plugin/strip_ansi.rs b/src/filter_plugin/strip_ansi.rs index 5c2202d..ee3e763 100644 --- a/src/filter_plugin/strip_ansi.rs +++ b/src/filter_plugin/strip_ansi.rs @@ -11,7 +11,7 @@ impl StripAnsiFilter { } impl FilterPlugin for StripAnsiFilter { - fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> { + fn filter(&mut self, mut reader: Box<&mut dyn Read>, mut writer: Box<&mut dyn Write>) -> Result<()> { let mut ansi_writer = Writer::new(writer); std::io::copy(&mut *reader, &mut ansi_writer)?; ansi_writer.flush() diff --git a/src/filter_plugin/tail.rs b/src/filter_plugin/tail.rs index bc170b0..d46823c 100644 --- a/src/filter_plugin/tail.rs +++ b/src/filter_plugin/tail.rs @@ -18,7 +18,7 @@ impl TailBytesFilter { } impl FilterPlugin for TailBytesFilter { - fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> { + fn filter(&mut self, mut reader: Box<&mut dyn Read>, mut writer: Box<&mut dyn Write>) -> Result<()> { let mut temp_buffer = vec![0; PIPESIZE]; loop { let bytes_read = reader.read(&mut temp_buffer)?; @@ -57,7 +57,7 @@ impl TailLinesFilter { } impl FilterPlugin for TailLinesFilter { - fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> { + fn filter(&mut self, mut reader: Box<&mut dyn Read>, mut 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?;