use crate::cli::PluginSubcommands;
use crate::error::Result;
use crate::plugin::manager::PluginManager;
pub fn run_plugin_command(subcommand: &PluginSubcommands) -> Result<()> {
match subcommand {
PluginSubcommands::List { all: _ } => run_plugin_list(),
PluginSubcommands::Install { plugin, version: _ } => run_plugin_install(plugin),
PluginSubcommands::Uninstall { plugin } => run_plugin_uninstall(plugin),
PluginSubcommands::Update { plugin } => run_plugin_update(plugin),
PluginSubcommands::Enable { plugin, disable } => {
if *disable {
run_plugin_disable(plugin)
} else {
run_plugin_enable(plugin)
}
}
PluginSubcommands::Info { plugin } => run_plugin_info(plugin),
}
}
pub fn run_plugin_list() -> Result<()> {
let manager = PluginManager::new()?;
println!(
"\n\x1b[1;34m╭─────────────────────────────────────────────────────────────────╮\x1b[0m"
);
println!(
"\x1b[1;34m│\x1b[0m 🔌 \x1b[1;36mInstalled Plugins\x1b[0m \x1b[1;34m│\x1b[0m"
);
println!(
"\x1b[1;34m├─────────────────────────────────────────────────────────────────┤\x1b[0m"
);
if manager.get_builtin_plugins().is_empty() && manager.get_external_plugins().is_empty() {
println!(
"\x1b[1;34m│\x1b[0m No plugins installed \x1b[1;34m│\x1b[0m"
);
} else {
println!(
"\x1b[1;34m│\x1b[0m \x1b[1;36m🔧 Built-in Plugins\x1b[0m \x1b[1;34m│\x1b[0m"
);
for plugin in manager.get_builtin_plugins() {
let info = plugin.info();
println!(
"\x1b[1;34m│\x1b[0m ✅ {:<25} v{:<10} \x1b[0;37m{}\x1b[0m",
info.name, info.version, info.description
);
}
println!(
"\x1b[1;34m│\x1b[0m \x1b[1;36m🌐 External Plugins\x1b[0m \x1b[1;34m│\x1b[0m"
);
for (name, plugin) in manager.get_external_plugins() {
let info = plugin.info();
let status = if manager.is_plugin_enabled(name) {
"✅"
} else {
"❌"
};
println!(
"\x1b[1;34m│\x1b[0m {} {:<25} v{:<10} \x1b[0;37m{}\x1b[0m",
status, info.name, info.version, info.description
);
}
}
println!(
"\x1b[1;34m╰─────────────────────────────────────────────────────────────────╯\x1b[0m"
);
Ok(())
}
pub fn run_plugin_install(plugin: &str) -> Result<()> {
let mut manager = PluginManager::new()?;
println!("🔄 Installing plugin: {plugin}");
manager.install_plugin(plugin)?;
println!("✅ Plugin '{plugin}' installed successfully");
Ok(())
}
pub fn run_plugin_uninstall(plugin: &str) -> Result<()> {
let mut manager = PluginManager::new()?;
println!("🗑️ Uninstalling plugin: {plugin}");
manager.uninstall_plugin(plugin)?;
println!("✅ Plugin '{plugin}' uninstalled successfully");
Ok(())
}
pub fn run_plugin_update(plugin: &str) -> Result<()> {
let mut manager = PluginManager::new()?;
println!("🔄 Updating plugin: {plugin}");
manager.update_plugin(plugin)?;
println!("✅ Plugin '{plugin}' updated successfully");
Ok(())
}
pub fn run_plugin_enable(plugin: &str) -> Result<()> {
let mut manager = PluginManager::new()?;
println!("✅ Enabling plugin: {plugin}");
manager.enable_plugin(plugin)?;
println!("✅ Plugin '{plugin}' enabled successfully");
Ok(())
}
pub fn run_plugin_disable(plugin: &str) -> Result<()> {
let mut manager = PluginManager::new()?;
println!("❌ Disabling plugin: {plugin}");
manager.disable_plugin(plugin)?;
println!("✅ Plugin '{plugin}' disabled successfully");
Ok(())
}
pub fn run_plugin_info(plugin: &str) -> Result<()> {
let manager = PluginManager::new()?;
if let Some(info) = manager.get_plugin_info(plugin) {
println!("\n🔌 Plugin Information:");
println!("Name: {}", info.name);
println!("Version: {}", info.version);
println!("Description: {}", info.description);
println!("Author: {}", info.author);
println!("Type: {:?}", info.plugin_type);
println!("Extensions: {:?}", info.extensions);
println!("Entry Files: {:?}", info.entry_files);
println!("Dependencies: {:?}", info.dependencies);
println!("Capabilities: {:?}", info.capabilities);
} else {
println!("❌ Plugin '{plugin}' not found");
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_run_plugin_command_list() {
let result = run_plugin_command(&PluginSubcommands::List { all: false });
assert!(result.is_ok());
}
#[test]
fn test_run_plugin_command_info_nonexistent() {
let result = run_plugin_command(&PluginSubcommands::Info {
plugin: "nonexistent_plugin_12345".to_string(),
});
assert!(result.is_ok());
}
#[test]
fn test_run_plugin_command_enable_disable() {
let result = run_plugin_command(&PluginSubcommands::Enable {
plugin: "test_plugin".to_string(),
disable: false,
});
assert!(result.is_err() || result.is_ok());
let result = run_plugin_command(&PluginSubcommands::Enable {
plugin: "test_plugin".to_string(),
disable: true,
});
assert!(result.is_err() || result.is_ok());
}
#[test]
fn test_run_plugin_list_empty() {
let result = run_plugin_list();
assert!(result.is_ok());
}
#[test]
fn test_run_plugin_install_invalid() {
use std::time::{SystemTime, UNIX_EPOCH};
let timestamp = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs();
let plugin_name = format!("invalid_plugin_name_{timestamp}");
let result = run_plugin_install(&plugin_name);
assert!(result.is_ok());
}
#[test]
fn test_run_plugin_uninstall_nonexistent() {
let result = run_plugin_uninstall("nonexistent_plugin_12345");
assert!(result.is_ok());
}
#[test]
fn test_run_plugin_update_nonexistent() {
let result = run_plugin_update("nonexistent_plugin_12345");
assert!(result.is_err());
}
#[test]
fn test_run_plugin_enable_nonexistent() {
let result = run_plugin_enable("nonexistent_plugin_12345");
assert!(result.is_err());
}
#[test]
fn test_run_plugin_disable_nonexistent() {
let result = run_plugin_disable("nonexistent_plugin_12345");
assert!(result.is_err());
}
#[test]
fn test_run_plugin_info_nonexistent() {
let result = run_plugin_info("nonexistent_plugin_12345");
assert!(result.is_ok());
}
#[test]
fn test_plugin_subcommands_coverage() {
let subcommands = vec![
PluginSubcommands::List { all: true },
PluginSubcommands::List { all: false },
PluginSubcommands::Install {
plugin: "test".to_string(),
version: None,
},
PluginSubcommands::Install {
plugin: "test".to_string(),
version: Some("1.0.0".to_string()),
},
PluginSubcommands::Uninstall {
plugin: "test".to_string(),
},
PluginSubcommands::Update {
plugin: "test".to_string(),
},
PluginSubcommands::Enable {
plugin: "test".to_string(),
disable: false,
},
PluginSubcommands::Enable {
plugin: "test".to_string(),
disable: true,
},
PluginSubcommands::Info {
plugin: "test".to_string(),
},
];
for subcommand in subcommands {
let result = run_plugin_command(&subcommand);
assert!(result.is_ok() || result.is_err());
}
}
#[test]
fn test_plugin_command_error_handling() {
let result = run_plugin_install("");
assert!(result.is_err());
let result = run_plugin_uninstall("");
assert!(result.is_ok());
let result = run_plugin_info("");
assert!(result.is_ok());
let long_name = "a".repeat(1000);
let result = run_plugin_install(&long_name);
assert!(result.is_err());
}
#[test]
fn test_plugin_list_output_format() {
let result = run_plugin_list();
assert!(result.is_ok());
}
}