fix: Adjust filter trait and implementations for mutable boxed I/O

Co-authored-by: aider (openai/andrew/openrouter/deepseek/deepseek-chat-v3.1) <aider@aider.chat>
This commit is contained in:
Andrew Phillips
2025-09-02 16:33:53 -03:00
parent 288ab8a74d
commit f527dfc83b
6 changed files with 23 additions and 23 deletions

View File

@@ -17,12 +17,12 @@ impl GrepFilter {
}
impl FilterPlugin for GrepFilter {
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);
fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> {
let mut buf_reader = std::io::BufReader::new(&mut *reader);
for line in buf_reader.by_ref().lines() {
let line = line?;
if self.regex.is_match(&line) {
writeln!(writer, "{}", line)?;
writeln!(&mut *writer, "{}", line)?;
}
}
Ok(())

View File

@@ -15,7 +15,7 @@ impl HeadBytesFilter {
}
impl FilterPlugin for HeadBytesFilter {
fn filter(&mut self, mut reader: Box<&mut dyn Read>, mut writer: Box<&mut dyn Write>) -> Result<()> {
fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> {
if self.remaining == 0 {
return Ok(());
}
@@ -23,11 +23,11 @@ impl FilterPlugin for HeadBytesFilter {
let mut buffer = vec![0; PIPESIZE];
while self.remaining > 0 {
let to_read = std::cmp::min(self.remaining, PIPESIZE);
let bytes_read = reader.read(&mut buffer[..to_read])?;
let bytes_read = (&mut *reader).read(&mut buffer[..to_read])?;
if bytes_read == 0 {
break;
}
writer.write_all(&buffer[..bytes_read])?;
(&mut *writer).write_all(&buffer[..bytes_read])?;
self.remaining -= bytes_read;
}
Ok(())
@@ -47,15 +47,15 @@ impl HeadLinesFilter {
}
impl FilterPlugin for HeadLinesFilter {
fn filter(&mut self, mut reader: Box<&mut dyn Read>, mut writer: Box<&mut dyn Write>) -> Result<()> {
fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> {
if self.remaining == 0 {
return Ok(());
}
let mut buf_reader = std::io::BufReader::new(reader);
let mut buf_reader = std::io::BufReader::new(&mut *reader);
for line in buf_reader.by_ref().lines() {
let line = line?;
writeln!(writer, "{}", line)?;
writeln!(&mut *writer, "{}", line)?;
self.remaining -= 1;
if self.remaining == 0 {
break;

View File

@@ -8,7 +8,7 @@ pub mod strip_ansi;
pub mod utils;
pub trait FilterPlugin: Send {
fn filter(&mut self, mut reader: Box<&mut dyn Read>, mut writer: Box<&mut dyn Write>) -> Result<()>;
fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()>;
}
pub struct FilterChain {

View File

@@ -15,13 +15,13 @@ impl SkipBytesFilter {
}
impl FilterPlugin for SkipBytesFilter {
fn filter(&mut self, mut reader: Box<&mut dyn Read>, mut writer: Box<&mut dyn Write>) -> 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];
while self.remaining > 0 {
let to_read = std::cmp::min(self.remaining, PIPESIZE);
let bytes_read = reader.read(&mut buffer[..to_read])?;
let bytes_read = (&mut *reader).read(&mut buffer[..to_read])?;
if bytes_read == 0 {
break;
}
@@ -48,14 +48,14 @@ impl SkipLinesFilter {
}
impl FilterPlugin for SkipLinesFilter {
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);
fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> {
let mut buf_reader = std::io::BufReader::new(&mut *reader);
for line in buf_reader.by_ref().lines() {
let line = line?;
if self.remaining > 0 {
self.remaining -= 1;
} else {
writeln!(writer, "{}", line)?;
writeln!(&mut *writer, "{}", line)?;
}
}
Ok(())

View File

@@ -11,8 +11,8 @@ impl StripAnsiFilter {
}
impl FilterPlugin for StripAnsiFilter {
fn filter(&mut self, mut reader: Box<&mut dyn Read>, mut writer: Box<&mut dyn Write>) -> Result<()> {
let mut ansi_writer = Writer::new(writer);
fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> {
let mut ansi_writer = Writer::new(&mut *writer);
std::io::copy(&mut *reader, &mut ansi_writer)?;
ansi_writer.flush()
}

View File

@@ -18,10 +18,10 @@ impl TailBytesFilter {
}
impl FilterPlugin for TailBytesFilter {
fn filter(&mut self, mut reader: Box<&mut dyn Read>, mut writer: Box<&mut dyn Write>) -> 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)?;
let bytes_read = (&mut *reader).read(&mut temp_buffer)?;
if bytes_read == 0 {
break;
}
@@ -37,7 +37,7 @@ impl FilterPlugin for TailBytesFilter {
// Write the buffered data at the end
let result: Vec<u8> = self.buffer.iter().cloned().collect();
writer.write_all(&result)?;
(&mut *writer).write_all(&result)?;
Ok(())
}
}
@@ -57,8 +57,8 @@ impl TailLinesFilter {
}
impl FilterPlugin for TailLinesFilter {
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);
fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()> {
let mut buf_reader = std::io::BufReader::new(&mut *reader);
for line in buf_reader.by_ref().lines() {
let line = line?;
if self.lines.len() == self.count {
@@ -69,7 +69,7 @@ impl FilterPlugin for TailLinesFilter {
// Write the buffered lines
for line in &self.lines {
writeln!(writer, "{}", line)?;
writeln!(&mut *writer, "{}", line)?;
}
Ok(())
}