refactor: Implement StripAnsiFilter in streaming fashion using strip-ansi-escapes::Writer

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 11:57:16 -03:00
parent 9a25bdea37
commit 44624ba3c1

View File

@@ -1,5 +1,5 @@
use std::io::{Result, Read, Write}; use std::io::{Result, Read, Write};
use strip_ansi_escapes::strip as strip_ansi_escapes; use strip_ansi_escapes::Writer;
use crate::common::PIPESIZE; use crate::common::PIPESIZE;
use super::FilterPlugin; use super::FilterPlugin;
@@ -15,18 +15,16 @@ impl StripAnsiFilter {
impl FilterPlugin for StripAnsiFilter { impl FilterPlugin for StripAnsiFilter {
fn filter<R: Read, W: Write>(&mut self, reader: &mut R, writer: &mut W) -> Result<()> { fn filter<R: Read, W: Write>(&mut self, reader: &mut R, writer: &mut W) -> Result<()> {
let mut buffer = vec![0; PIPESIZE]; let mut buffer = vec![0; PIPESIZE];
let mut processed_data = Vec::new(); let mut ansi_writer = Writer::new(writer);
loop { loop {
let bytes_read = reader.read(&mut buffer)?; let bytes_read = reader.read(&mut buffer)?;
if bytes_read == 0 { if bytes_read == 0 {
break; break;
} }
processed_data.extend_from_slice(&buffer[..bytes_read]); ansi_writer.write_all(&buffer[..bytes_read])?;
} }
ansi_writer.flush()?;
let stripped = strip_ansi_escapes(&processed_data);
writer.write_all(&stripped)?;
Ok(()) Ok(())
} }
} }