use std::collections::HashMap;
use std::path::PathBuf;
use super::manifest::LoadedPlugin;
#[derive(Debug, Clone, Default)]
pub struct PluginRegistry {
plugins: HashMap<String, LoadedPlugin>,
user_overrides: HashMap<String, bool>,
overrides_path: Option<PathBuf>,
}
impl PluginRegistry {
pub fn new() -> Self {
Self::default()
}
pub fn set_overrides_store(&mut self, path: PathBuf, overrides: HashMap<String, bool>) {
self.overrides_path = Some(path);
self.user_overrides = overrides;
}
pub fn apply_overrides(&mut self) {
for (name, &enabled) in &self.user_overrides {
if let Some(plugin) = self.plugins.get_mut(name) {
plugin.enabled = enabled;
}
}
}
pub fn register(&mut self, name: String, plugin: LoadedPlugin) {
self.plugins.insert(name, plugin);
}
pub fn enable(&mut self, name: &str) -> bool {
if let Some(plugin) = self.plugins.get_mut(name) {
plugin.enabled = true;
self.user_overrides.insert(name.to_string(), true);
self.persist_overrides();
true
} else {
false
}
}
pub fn disable(&mut self, name: &str) -> bool {
if let Some(plugin) = self.plugins.get_mut(name) {
plugin.enabled = false;
self.user_overrides.insert(name.to_string(), false);
self.persist_overrides();
true
} else {
false
}
}
fn persist_overrides(&self) {
if let Some(path) = &self.overrides_path
&& let Err(e) = super::discovery::save_overrides(path, &self.user_overrides)
{
tracing::warn!(
"failed to persist plugin overrides to {}: {e}",
path.display()
);
}
}
pub fn list(&self) -> Vec<(&String, &LoadedPlugin)> {
self.plugins.iter().collect()
}
pub fn get(&self, name: &str) -> Option<&LoadedPlugin> {
self.plugins.get(name)
}
pub fn enabled_plugins(&self) -> Vec<(&String, &LoadedPlugin)> {
self.list_enabled()
}
pub fn list_enabled(&self) -> Vec<(&String, &LoadedPlugin)> {
self.plugins.iter().filter(|(_, p)| p.enabled).collect()
}
pub fn is_enabled(&self, name: &str) -> bool {
self.plugins.get(name).is_some_and(|p| p.enabled)
}
pub fn len(&self) -> usize {
self.plugins.len()
}
pub fn is_empty(&self) -> bool {
self.plugins.is_empty()
}
}