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