diff --git a/src/filter_plugin/head.rs b/src/filter_plugin/head.rs index 27d1893..efdc7e0 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: &mut R, writer: &mut W) -> Result<()> { + fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> { if self.remaining == 0 { return Ok(()); } @@ -47,13 +47,13 @@ impl HeadLinesFilter { } impl FilterPlugin for HeadLinesFilter { - 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<()> { if self.remaining == 0 { return Ok(()); } - let buf_reader = std::io::BufReader::new(reader); - for line in buf_reader.lines() { + let mut buf_reader = std::io::BufReader::new(reader); + for line in buf_reader.by_ref().lines() { let line = line?; writeln!(writer, "{}", line)?; self.remaining -= 1; diff --git a/src/filter_plugin/skip.rs b/src/filter_plugin/skip.rs index 9bb897a..46b2dfb 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: &mut R, writer: &mut W) -> Result<()> { + fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> { // Skip bytes in chunks if self.remaining > 0 { let mut buffer = vec![0; PIPESIZE]; @@ -30,7 +30,8 @@ impl FilterPlugin for SkipBytesFilter { } // Copy the remaining data using io::copy for efficiency - std::io::copy(reader, writer) + std::io::copy(&mut *reader, &mut *writer)?; + Ok(()) } } @@ -47,9 +48,9 @@ impl SkipLinesFilter { } impl FilterPlugin for SkipLinesFilter { - 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.remaining > 0 { self.remaining -= 1; diff --git a/src/filter_plugin/tail.rs b/src/filter_plugin/tail.rs index 8927107..bc170b0 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: &mut R, writer: &mut W) -> Result<()> { + fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> { let mut temp_buffer = vec![0; PIPESIZE]; loop { let bytes_read = reader.read(&mut temp_buffer)?; @@ -57,9 +57,9 @@ impl TailLinesFilter { } impl FilterPlugin for TailLinesFilter { - 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.lines.len() == self.count { self.lines.pop_front();