refactor: Use plugin registry for filter service discovery

Co-authored-by: aider (openai/andrew/openrouter/deepseek/deepseek-chat-v3.1) <aider@aider.chat>
This commit is contained in:
Andrew Phillips
2025-09-03 09:31:05 -03:00
parent 96deafbf78
commit 21f195d8f6
3 changed files with 21 additions and 46 deletions

View File

@@ -1,6 +1,8 @@
use crate::filter_plugin::{FilterChain, parse_filter_string};
use std::collections::HashMap;
use std::io::{Result, Read, Write};
use once_cell::sync::Lazy;
use std::sync::Mutex;
pub struct FilterService;
@@ -48,52 +50,16 @@ impl FilterService {
}
}
/// Global registry for filter plugins
static FILTER_PLUGIN_REGISTRY: Lazy<Mutex<HashMap<String, fn() -> Box<dyn crate::filter_plugin::FilterPlugin>>>> =
Lazy::new(|| Mutex::new(HashMap::new()));
/// Register a filter plugin with the global registry
pub fn register_filter_plugin(name: &str, constructor: fn() -> Box<dyn crate::filter_plugin::FilterPlugin>) {
FILTER_PLUGIN_REGISTRY.lock().unwrap().insert(name.to_string(), constructor);
}
/// Get a map of available filter plugins
pub fn get_available_filter_plugins() -> HashMap<String, fn() -> Box<dyn crate::filter_plugin::FilterPlugin>> {
let mut plugins = HashMap::new();
// Register all available filter plugins using function pointers
plugins.insert("head_bytes".to_string(), create_head_bytes_filter);
plugins.insert("head_lines".to_string(), create_head_lines_filter);
plugins.insert("tail_bytes".to_string(), create_tail_bytes_filter);
plugins.insert("tail_lines".to_string(), create_tail_lines_filter);
plugins.insert("skip_bytes".to_string(), create_skip_bytes_filter);
plugins.insert("skip_lines".to_string(), create_skip_lines_filter);
plugins.insert("grep".to_string(), create_grep_filter);
plugins.insert("strip_ansi".to_string(), create_strip_ansi_filter);
plugins
}
// Helper functions to create each filter plugin
fn create_head_bytes_filter() -> Box<dyn crate::filter_plugin::FilterPlugin> {
Box::new(crate::filter_plugin::head::HeadBytesFilter::new(0))
}
fn create_head_lines_filter() -> Box<dyn crate::filter_plugin::FilterPlugin> {
Box::new(crate::filter_plugin::head::HeadLinesFilter::new(0))
}
fn create_tail_bytes_filter() -> Box<dyn crate::filter_plugin::FilterPlugin> {
Box::new(crate::filter_plugin::tail::TailBytesFilter::new(0))
}
fn create_tail_lines_filter() -> Box<dyn crate::filter_plugin::FilterPlugin> {
Box::new(crate::filter_plugin::tail::TailLinesFilter::new(0))
}
fn create_skip_bytes_filter() -> Box<dyn crate::filter_plugin::FilterPlugin> {
Box::new(crate::filter_plugin::skip::SkipBytesFilter::new(0))
}
fn create_skip_lines_filter() -> Box<dyn crate::filter_plugin::FilterPlugin> {
Box::new(crate::filter_plugin::skip::SkipLinesFilter::new(0))
}
fn create_grep_filter() -> Box<dyn crate::filter_plugin::FilterPlugin> {
Box::new(crate::filter_plugin::grep::GrepFilter::new("".to_string()).unwrap())
}
fn create_strip_ansi_filter() -> Box<dyn crate::filter_plugin::FilterPlugin> {
Box::new(crate::filter_plugin::strip_ansi::StripAnsiFilter::new())
FILTER_PLUGIN_REGISTRY.lock().unwrap().clone()
}