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:
@@ -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?;
|
||||
|
||||
@@ -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(());
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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?;
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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?;
|
||||
|
||||
Reference in New Issue
Block a user