use crate::factory::PluginFactory;
use crate::metadata::PluginMetadata;
use crate::plugins::Plugin;
use crate::status::{ChildPluginInfo, PluginStatus};
use libloading::Library;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::PathBuf;
use std::sync::Arc;
use tokio::sync::RwLock;
pub use crate::factory::CreatePluginFn;
pub type PluginMap = Arc<RwLock<HashMap<String, PluginInstance>>>;
pub struct PluginInstance {
pub plugin: Box<dyn Plugin>,
pub metadata: PluginMetadata,
pub status: PluginStatus,
pub child_plugins: Vec<ChildPluginInfo>,
pub _library: Arc<Library>,
pub fingerprint: String,
pub temp_library_path: Option<PathBuf>,
pub plugin_temp_dir: PathBuf,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PluginInfo {
pub metadata: PluginMetadata,
pub status: PluginStatus,
pub fingerprint: String,
pub child_plugins: Vec<ChildPluginInfo>,
}