fix: Correct filter trait and chain implementation for mutability

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:32:18 -03:00
parent 765a46a8d2
commit 288ab8a74d
6 changed files with 19 additions and 14 deletions

View File

@@ -17,7 +17,7 @@ impl GrepFilter {
} }
impl FilterPlugin for 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); let mut buf_reader = std::io::BufReader::new(reader);
for line in buf_reader.by_ref().lines() { for line in buf_reader.by_ref().lines() {
let line = line?; let line = line?;

View File

@@ -15,7 +15,7 @@ impl HeadBytesFilter {
} }
impl FilterPlugin for 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 { if self.remaining == 0 {
return Ok(()); return Ok(());
} }
@@ -47,7 +47,7 @@ impl HeadLinesFilter {
} }
impl FilterPlugin for 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 { if self.remaining == 0 {
return Ok(()); return Ok(());
} }

View File

@@ -8,7 +8,7 @@ pub mod strip_ansi;
pub mod utils; pub mod utils;
pub trait FilterPlugin: Send { 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 { pub struct FilterChain {
@@ -38,18 +38,23 @@ impl FilterChain {
let mut current_data = Vec::new(); let mut current_data = Vec::new();
std::io::copy(reader, &mut current_data)?; std::io::copy(reader, &mut current_data)?;
for (i, plugin) in self.plugins.iter_mut().enumerate() { // Store the plugins length to avoid borrowing issues
let mut input: Box<&mut dyn Read> = Box::new(&mut std::io::Cursor::new(&current_data)); 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(&current_data);
let mut input: Box<&mut dyn Read> = Box::new(&mut cursor);
// For the last plugin, write directly to the output writer // 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); let mut output: Box<&mut dyn Write> = Box::new(writer);
plugin.filter(input, output)?; self.plugins[i].filter(input, output)?;
} else { } else {
// For intermediate plugins, write to a buffer // For intermediate plugins, write to a buffer
let mut output = Vec::new(); let mut output = Vec::new();
let mut output_ref: Box<&mut dyn Write> = Box::new(&mut output); 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; current_data = output;
} }
} }

View File

@@ -15,7 +15,7 @@ impl SkipBytesFilter {
} }
impl FilterPlugin for 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 // Skip bytes in chunks
if self.remaining > 0 { if self.remaining > 0 {
let mut buffer = vec![0; PIPESIZE]; let mut buffer = vec![0; PIPESIZE];
@@ -48,7 +48,7 @@ impl SkipLinesFilter {
} }
impl FilterPlugin for 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); let mut buf_reader = std::io::BufReader::new(reader);
for line in buf_reader.by_ref().lines() { for line in buf_reader.by_ref().lines() {
let line = line?; let line = line?;

View File

@@ -11,7 +11,7 @@ impl StripAnsiFilter {
} }
impl FilterPlugin for 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); let mut ansi_writer = Writer::new(writer);
std::io::copy(&mut *reader, &mut ansi_writer)?; std::io::copy(&mut *reader, &mut ansi_writer)?;
ansi_writer.flush() ansi_writer.flush()

View File

@@ -18,7 +18,7 @@ impl TailBytesFilter {
} }
impl FilterPlugin for 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]; let mut temp_buffer = vec![0; PIPESIZE];
loop { loop {
let bytes_read = reader.read(&mut temp_buffer)?; let bytes_read = reader.read(&mut temp_buffer)?;
@@ -57,7 +57,7 @@ impl TailLinesFilter {
} }
impl FilterPlugin for 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); let mut buf_reader = std::io::BufReader::new(reader);
for line in buf_reader.by_ref().lines() { for line in buf_reader.by_ref().lines() {
let line = line?; let line = line?;