fix: Make FilterPlugin trait object-safe and update implementations
Co-authored-by: aider (openai/andrew/openrouter/deepseek/deepseek-chat-v3.1) <aider@aider.chat>
This commit is contained in:
@@ -17,9 +17,9 @@ impl GrepFilter {
|
||||
}
|
||||
|
||||
impl FilterPlugin for GrepFilter {
|
||||
fn filter<R: Read, W: Write>(&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.regex.is_match(&line) {
|
||||
writeln!(writer, "{}", line)?;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
use std::io::{Result, Read, Write};
|
||||
use std::io::BufRead;
|
||||
|
||||
pub mod head;
|
||||
pub mod tail;
|
||||
@@ -9,7 +8,7 @@ pub mod strip_ansi;
|
||||
pub mod utils;
|
||||
|
||||
pub trait FilterPlugin: Send {
|
||||
fn filter<R: Read, W: Write>(&mut self, reader: &mut R, writer: &mut W) -> Result<()>;
|
||||
fn filter(&mut self, reader: Box<&mut dyn Read>, writer: Box<&mut dyn Write>) -> Result<()>;
|
||||
}
|
||||
|
||||
pub struct FilterChain {
|
||||
@@ -27,7 +26,7 @@ impl FilterChain {
|
||||
self.plugins.push(plugin);
|
||||
}
|
||||
|
||||
pub fn filter<R: Read, W: Write>(&mut self, reader: &mut R, writer: &mut W) -> Result<()> {
|
||||
pub fn filter(&mut self, reader: &mut dyn Read, writer: &mut dyn Write) -> Result<()> {
|
||||
if self.plugins.is_empty() {
|
||||
// If no plugins, just copy the input to output
|
||||
std::io::copy(reader, writer)?;
|
||||
@@ -40,15 +39,17 @@ impl FilterChain {
|
||||
std::io::copy(reader, &mut current_data)?;
|
||||
|
||||
for (i, plugin) in self.plugins.iter_mut().enumerate() {
|
||||
let mut input = std::io::Cursor::new(¤t_data);
|
||||
let mut input: Box<&mut dyn Read> = Box::new(&mut std::io::Cursor::new(¤t_data));
|
||||
|
||||
// For the last plugin, write directly to the output writer
|
||||
if i == self.plugins.len() - 1 {
|
||||
plugin.filter(&mut input, writer)?;
|
||||
let mut output: Box<&mut dyn Write> = Box::new(writer);
|
||||
plugin.filter(input, output)?;
|
||||
} else {
|
||||
// For intermediate plugins, write to a buffer
|
||||
let mut output = Vec::new();
|
||||
plugin.filter(&mut input, &mut output)?;
|
||||
let mut output_ref: Box<&mut dyn Write> = Box::new(&mut output);
|
||||
plugin.filter(input, output_ref)?;
|
||||
current_data = output;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,9 +11,9 @@ impl StripAnsiFilter {
|
||||
}
|
||||
|
||||
impl FilterPlugin for StripAnsiFilter {
|
||||
fn filter<R: Read, W: Write>(&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 ansi_writer = Writer::new(writer);
|
||||
std::io::copy(reader, &mut ansi_writer)?;
|
||||
std::io::copy(&mut *reader, &mut ansi_writer)?;
|
||||
ansi_writer.flush()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user