1use anyhow::Result;
8use clap::{Parser, Subcommand};
9use colored::Colorize;
10use comfy_table::Table;
11use comfy_table::presets::UTF8_FULL;
12
13use crate::pkg::service::{self, ServiceAction};
14
15#[derive(Parser, Debug)]
17#[command(long_about = "Manages background services for installed packages.")]
18pub struct ServiceCommand {
19 #[command(subcommand)]
21 pub command: ServiceCommands
22}
23
24#[derive(Subcommand, Debug)]
26pub enum ServiceCommands {
27 Start {
29 package: String
31 },
32 Stop {
34 package: String
36 },
37 Restart {
39 package: String
41 },
42 Status {
44 package: String
46 },
47 Enable {
49 package: String
51 },
52 Disable {
54 package: String
56 },
57 #[command(alias = "ls")]
59 List
60}
61
62pub fn run(args: ServiceCommand) -> Result<()> {
68 match args.command {
69 ServiceCommands::Start { package } => {
70 println!("Starting service for package '{}'...", package.cyan());
71 service::manage_service(&package, ServiceAction::Start)?;
72 println!("{}", "Service started successfully.".green());
73 }
74 ServiceCommands::Stop { package } => {
75 println!("Stopping service for package '{}'...", package.cyan());
76 service::manage_service(&package, ServiceAction::Stop)?;
77 println!("{}", "Service stopped successfully.".green());
78 }
79 ServiceCommands::Restart { package } => {
80 println!("Restarting service for package '{}'...", package.cyan());
81 service::manage_service(&package, ServiceAction::Restart)?;
82 println!("{}", "Service restarted successfully.".green());
83 }
84 ServiceCommands::Status { package } => {
85 service::manage_service(&package, ServiceAction::Status)?;
86 }
87 ServiceCommands::Enable { package } => {
88 println!("Enabling service for package '{}'...", package.cyan());
89 service::manage_service(&package, ServiceAction::Enable)?;
90 println!("{}", "Service enabled successfully.".green());
91 }
92 ServiceCommands::Disable { package } => {
93 println!("Disabling service for package '{}'...", package.cyan());
94 service::manage_service(&package, ServiceAction::Disable)?;
95 println!("{}", "Service disabled successfully.".green());
96 }
97 ServiceCommands::List => {
98 let services = service::list_services()?;
99 if services.is_empty() {
100 println!("No installed packages define background services.");
101 return Ok(());
102 }
103
104 let mut table = Table::new();
105 table
106 .load_style(UTF8_FULL)
107 .set_header(vec!["Package", "Status"]);
108
109 for (pkg, status) in services {
110 let status_cell = if status == "active" || status == "running" {
111 status.green()
112 } else {
113 status.yellow()
114 };
115 table.add_row(vec![pkg.cyan(), status_cell.to_string().into()]);
116 }
117
118 println!("{table}");
119 }
120 }
121 Ok(())
122}