feat: add convenience methods to filter service and improve filter chain processing
Co-authored-by: aider (openai/andrew/openrouter/deepseek/deepseek-chat-v3.1) <aider@aider.chat>
This commit is contained in:
@@ -31,7 +31,10 @@ impl FilterChain {
|
|||||||
pub fn process(&mut self, data: &[u8]) -> Result<Vec<u8>> {
|
pub fn process(&mut self, data: &[u8]) -> Result<Vec<u8>> {
|
||||||
let mut current_data = data.to_vec();
|
let mut current_data = data.to_vec();
|
||||||
for plugin in &mut self.plugins {
|
for plugin in &mut self.plugins {
|
||||||
current_data = plugin.process(¤t_data)?;
|
// Process the current data through the plugin
|
||||||
|
let processed = plugin.process(¤t_data)?;
|
||||||
|
current_data = processed;
|
||||||
|
|
||||||
// Early exit if no data remains
|
// Early exit if no data remains
|
||||||
if current_data.is_empty() {
|
if current_data.is_empty() {
|
||||||
break;
|
break;
|
||||||
@@ -42,20 +45,15 @@ impl FilterChain {
|
|||||||
|
|
||||||
pub fn finish(&mut self) -> Result<Vec<u8>> {
|
pub fn finish(&mut self) -> Result<Vec<u8>> {
|
||||||
let mut result = Vec::new();
|
let mut result = Vec::new();
|
||||||
let mut all_data = Vec::new();
|
|
||||||
|
// Process each plugin's finish method and collect results
|
||||||
for plugin in &mut self.plugins {
|
for plugin in &mut self.plugins {
|
||||||
let processed = plugin.finish()?;
|
let finished_data = plugin.finish()?;
|
||||||
if !processed.is_empty() {
|
if !finished_data.is_empty() {
|
||||||
all_data.extend(processed);
|
result.extend(finished_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we have any data from finish, use it
|
|
||||||
if !all_data.is_empty() {
|
|
||||||
result = all_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(result)
|
Ok(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,4 +31,29 @@ impl FilterService {
|
|||||||
Ok(Vec::new())
|
Ok(Vec::new())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add a method to process data through the filter chain and handle finish automatically
|
||||||
|
pub fn process_all_data(&self, chain: &mut Option<FilterChain>, data: &[u8]) -> Result<Vec<u8>> {
|
||||||
|
let mut processed = if let Some(chain) = chain {
|
||||||
|
chain.process(data)?
|
||||||
|
} else {
|
||||||
|
data.to_vec()
|
||||||
|
};
|
||||||
|
|
||||||
|
// If we have a chain, also get any remaining data from finish()
|
||||||
|
if chain.is_some() {
|
||||||
|
let finished = self.finish_processing(chain)?;
|
||||||
|
if !finished.is_empty() {
|
||||||
|
processed.extend(finished);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(processed)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper method to create and process data with a filter string in one call
|
||||||
|
pub fn process_with_filter(&self, data: &[u8], filter_str: Option<&str>) -> Result<Vec<u8>> {
|
||||||
|
let mut chain = self.create_filter_chain(filter_str)?;
|
||||||
|
self.process_all_data(&mut chain, data)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user