use crate::pkg::service::{self, ServiceAction};
use anyhow::Result;
use clap::{Parser, Subcommand};
use colored::*;
use comfy_table::{Table, presets::UTF8_FULL};
#[derive(Parser, Debug)]
#[command(long_about = "Manages background services for installed packages.")]
pub struct ServiceCommand {
#[command(subcommand)]
pub command: ServiceCommands,
}
#[derive(Subcommand, Debug)]
pub enum ServiceCommands {
Start {
package: String,
},
Stop {
package: String,
},
Restart {
package: String,
},
Status {
package: String,
},
Enable {
package: String,
},
Disable {
package: String,
},
#[command(alias = "ls")]
List,
}
pub fn run(args: ServiceCommand) -> Result<()> {
match args.command {
ServiceCommands::Start { package } => {
println!("Starting service for package '{}'...", package.cyan());
service::manage_service(&package, ServiceAction::Start)?;
println!("{}", "Service started successfully.".green());
}
ServiceCommands::Stop { package } => {
println!("Stopping service for package '{}'...", package.cyan());
service::manage_service(&package, ServiceAction::Stop)?;
println!("{}", "Service stopped successfully.".green());
}
ServiceCommands::Restart { package } => {
println!("Restarting service for package '{}'...", package.cyan());
service::manage_service(&package, ServiceAction::Restart)?;
println!("{}", "Service restarted successfully.".green());
}
ServiceCommands::Status { package } => {
service::manage_service(&package, ServiceAction::Status)?;
}
ServiceCommands::Enable { package } => {
println!("Enabling service for package '{}'...", package.cyan());
service::manage_service(&package, ServiceAction::Enable)?;
println!("{}", "Service enabled successfully.".green());
}
ServiceCommands::Disable { package } => {
println!("Disabling service for package '{}'...", package.cyan());
service::manage_service(&package, ServiceAction::Disable)?;
println!("{}", "Service disabled successfully.".green());
}
ServiceCommands::List => {
let services = service::list_services()?;
if services.is_empty() {
println!("No installed packages define background services.");
return Ok(());
}
let mut table = Table::new();
table
.load_preset(UTF8_FULL)
.set_header(vec!["Package", "Status"]);
for (pkg, status) in services {
let status_cell = if status == "active" || status == "running" {
status.green()
} else {
status.yellow()
};
table.add_row(vec![pkg.cyan(), status_cell.to_string().into()]);
}
println!("{}", table);
}
}
Ok(())
}