1use crate::pkg::service::{self, ServiceAction};
2use anyhow::Result;
3use clap::{Parser, Subcommand};
4use colored::*;
5use comfy_table::{Table, presets::UTF8_FULL};
6
7#[derive(Parser, Debug)]
8#[command(long_about = "Manages background services for installed packages.")]
9pub struct ServiceCommand {
10 #[command(subcommand)]
11 pub command: ServiceCommands,
12}
13
14#[derive(Subcommand, Debug)]
15pub enum ServiceCommands {
16 Start {
18 package: String,
20 },
21 Stop {
23 package: String,
25 },
26 Restart {
28 package: String,
30 },
31 Status {
33 package: String,
35 },
36 Enable {
38 package: String,
40 },
41 Disable {
43 package: String,
45 },
46 #[command(alias = "ls")]
48 List,
49}
50
51pub fn run(args: ServiceCommand) -> Result<()> {
52 match args.command {
53 ServiceCommands::Start { package } => {
54 println!("Starting service for package '{}'...", package.cyan());
55 service::manage_service(&package, ServiceAction::Start)?;
56 println!("{}", "Service started successfully.".green());
57 }
58 ServiceCommands::Stop { package } => {
59 println!("Stopping service for package '{}'...", package.cyan());
60 service::manage_service(&package, ServiceAction::Stop)?;
61 println!("{}", "Service stopped successfully.".green());
62 }
63 ServiceCommands::Restart { package } => {
64 println!("Restarting service for package '{}'...", package.cyan());
65 service::manage_service(&package, ServiceAction::Restart)?;
66 println!("{}", "Service restarted successfully.".green());
67 }
68 ServiceCommands::Status { package } => {
69 service::manage_service(&package, ServiceAction::Status)?;
70 }
71 ServiceCommands::Enable { package } => {
72 println!("Enabling service for package '{}'...", package.cyan());
73 service::manage_service(&package, ServiceAction::Enable)?;
74 println!("{}", "Service enabled successfully.".green());
75 }
76 ServiceCommands::Disable { package } => {
77 println!("Disabling service for package '{}'...", package.cyan());
78 service::manage_service(&package, ServiceAction::Disable)?;
79 println!("{}", "Service disabled successfully.".green());
80 }
81 ServiceCommands::List => {
82 let services = service::list_services()?;
83 if services.is_empty() {
84 println!("No installed packages define background services.");
85 return Ok(());
86 }
87
88 let mut table = Table::new();
89 table
90 .load_preset(UTF8_FULL)
91 .set_header(vec!["Package", "Status"]);
92
93 for (pkg, status) in services {
94 let status_cell = if status == "active" || status == "running" {
95 status.green()
96 } else {
97 status.yellow()
98 };
99 table.add_row(vec![pkg.cyan(), status_cell.to_string().into()]);
100 }
101
102 println!("{}", table);
103 }
104 }
105 Ok(())
106}