use std::path::PathBuf;
use std::sync::Arc;
use anyhow::Result;
use tokio::sync::RwLock;
use super::{PluginCache, PluginLoader, PluginManifest, PluginResult, PluginRuntime};
use crate::config::PluginRuntimeConfig;
pub struct PluginManager {
runtime: Arc<PluginRuntime>,
loader: Arc<PluginLoader>,
cache: Arc<RwLock<PluginCache>>,
}
impl PluginManager {
pub fn new(config: PluginRuntimeConfig, base_dir: PathBuf) -> Result<Self> {
let runtime = Arc::new(PluginRuntime::new(config.clone(), base_dir.join("runtime")));
let cache = Arc::new(RwLock::new(PluginCache::new(base_dir.join("cache"))));
let loader = Arc::new(PluginLoader::new(
base_dir.join("installed"),
runtime.as_ref().clone(),
));
Ok(Self {
runtime,
loader,
cache,
})
}
pub async fn install_plugin(
&self,
source: super::loader::PluginSource,
name: Option<String>,
) -> PluginResult<()> {
self.loader.install_plugin(source, name).await?;
Ok(())
}
pub async fn uninstall_plugin(&self, plugin_name: &str) -> PluginResult<()> {
self.loader.uninstall_plugin(plugin_name).await?;
Ok(())
}
pub async fn enable_plugin(&self, plugin_name: &str) -> PluginResult<()> {
self.runtime.enable_plugin(plugin_name).await?;
Ok(())
}
pub async fn disable_plugin(&self, plugin_name: &str) -> PluginResult<()> {
self.runtime.disable_plugin(plugin_name).await?;
Ok(())
}
pub async fn load_plugin(&self, plugin_path: &std::path::Path) -> PluginResult<()> {
self.runtime.load_plugin(plugin_path).await?;
Ok(())
}
pub async fn get_plugin(&self, plugin_id: &str) -> PluginResult<super::runtime::PluginHandle> {
self.runtime.get_plugin(plugin_id).await
}
pub async fn list_installed_plugins(&self) -> PluginResult<Vec<String>> {
self.loader.list_installed_plugins().await
}
pub async fn list_loaded_plugins(&self) -> Vec<super::runtime::PluginHandle> {
self.runtime.list_plugins().await
}
pub async fn process_plugin_components(
&self,
plugin_path: &std::path::Path,
manifest: &PluginManifest,
) -> Result<super::components::PluginComponents> {
super::components::PluginComponentsHandler::process_all_components(plugin_path, manifest)
.await
}
pub async fn is_plugin_enabled(&self, plugin_id: &str) -> bool {
self.runtime.is_plugin_enabled(plugin_id).await
}
pub async fn cache_plugin(
&self,
plugin_id: &str,
source_path: &std::path::Path,
) -> PluginResult<PathBuf> {
let mut cache = self.cache.write().await;
cache.cache_plugin(plugin_id, source_path).await
}
pub async fn get_cached_plugin(&self, plugin_id: &str) -> Option<PathBuf> {
let cache = self.cache.read().await;
cache.get_cached_plugin(plugin_id).cloned()
}
}