1
use std::{env::current_exe, ffi::OsString};
2

            
3
use clap::Args;
4
use service_manager::{
5
    ServiceInstallCtx, ServiceLabel, ServiceManager, ServiceStartCtx, ServiceUninstallCtx,
6
};
7

            
8
#[derive(Debug, Args)]
9
pub struct CommandArgs {
10
    /// Whether to register a systemd service to automatically add launch options to steam
11
    #[arg(long)]
12
    pub service: bool,
13

            
14
    /// Disables prompting and sets up based upon the args passed
15
    #[arg(long)]
16
    pub no_prompt: bool,
17
}
18

            
19
const LABEL: &str = "com.protontweaks.watch";
20

            
21
fn get_manager(label: &str) -> Result<(ServiceLabel, Box<dyn ServiceManager>), String> {
22
    // Get generic service by detecting what is available on the platform
23
    let manager = <dyn ServiceManager>::native()
24
        .map_err(|_| "Failed to detect management platform".to_string())?;
25

            
26
    Ok((label.parse().unwrap(), manager))
27
}
28

            
29
pub async fn register() -> Result<(), String> {
30
    let (label, manager) = get_manager(LABEL)?;
31

            
32
    manager
33
        .install(ServiceInstallCtx {
34
            label: label.clone(),
35
            program: current_exe().unwrap(),
36
            args: vec![OsString::from("watch")],
37
            contents: None,
38
            username: None,
39
            working_directory: None,
40
            environment: None,
41
        })
42
        .map_err(|e| e.to_string())?;
43

            
44
    manager
45
        .start(ServiceStartCtx {
46
            label: label.clone(),
47
        })
48
        .map_err(|e| e.to_string())?;
49

            
50
    Ok(())
51
}
52

            
53
pub async fn unregister() -> Result<(), String> {
54
    let (label, manager) = get_manager(LABEL)?;
55

            
56
    if let Err(_) = manager.uninstall(ServiceUninstallCtx {
57
        label: label.clone(),
58
    }) {
59
        return Err("Service does not exist!".to_string());
60
    }
61

            
62
    Ok(())
63
}