Skip to main content

zoi_cli/cmd/
service.rs

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 a service
17    Start {
18        /// The name of the package whose service to start
19        package: String,
20    },
21    /// Stop a service
22    Stop {
23        /// The name of the package whose service to stop
24        package: String,
25    },
26    /// Restart a service
27    Restart {
28        /// The name of the package whose service to restart
29        package: String,
30    },
31    /// Show the status of a service
32    Status {
33        /// The name of the package whose service status to show
34        package: String,
35    },
36    /// Enable a service (start at boot)
37    Enable {
38        /// The name of the package whose service to enable
39        package: String,
40    },
41    /// Disable a service
42    Disable {
43        /// The name of the package whose service to disable
44        package: String,
45    },
46    /// List all packages that define a service and their current status
47    #[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}