support_kit/args/
service_args.rs

1use clap::Parser;
2
3use super::ServiceCommand;
4
5#[derive(Clone, Debug, Default, Parser, PartialEq)]
6#[clap(rename_all = "kebab-case")]
7pub struct ServiceArgs {
8    /// Control the service itself.
9    #[clap(subcommand)]
10    pub operation: Option<ServiceCommand>,
11}
12
13impl ServiceArgs {
14    pub fn new(operation: Option<ServiceCommand>) -> Self {
15        Self { operation }
16    }
17}
18
19impl From<ServiceCommand> for ServiceArgs {
20    fn from(command: ServiceCommand) -> Self {
21        Self::new(Some(command))
22    }
23}
24
25#[test]
26fn operations() -> Result<(), Box<dyn std::error::Error>> {
27    use crate::Args;
28
29    use clap::Parser;
30    use ServiceCommand::*;
31
32    let expectations = [
33        ("app service", None),
34        ("app service install", Some(Install(Default::default()))),
35        ("app service start", Some(Start)),
36        ("app service stop", Some(Stop)),
37        ("app service uninstall", Some(Uninstall)),
38    ];
39
40    for (input, expected) in expectations {
41        let cli = Args::try_parse_from(input.split_whitespace())?;
42
43        assert_eq!(cli.command, Some(ServiceArgs::new(expected).into()));
44    }
45
46    Ok(())
47}
48
49#[test]
50fn setting_labels() -> Result<(), Box<dyn std::error::Error>> {
51    use crate::Args;
52
53    use clap::Parser;
54
55    let expectations = [
56        ("app", "support-kit"),
57        ("app -n app-name", "app-name"),
58        ("app --name app-name", "app-name"),
59    ];
60
61    for (input, expected) in expectations {
62        let cli = Args::try_parse_from(input.split_whitespace())?;
63
64        assert_eq!(cli.name.unwrap_or_default(), expected.into());
65    }
66
67    Ok(())
68}
69
70#[test]
71fn setting_service_manager() -> Result<(), Box<dyn std::error::Error>> {
72    use crate::Args;
73
74    use clap::Parser;
75    use service_manager::ServiceManagerKind::*;
76
77    let expectations = [
78        ("app", None),
79        ("app --service-manager systemd", Some(Systemd)),
80        ("app --service-manager winsw", Some(WinSw)),
81        ("app --service-manager launchd", Some(Launchd)),
82        ("app --service-manager openrc", Some(OpenRc)),
83        ("app --service-manager rcd", Some(Rcd)),
84        ("app --service-manager sc", Some(Sc)),
85    ];
86
87    for (input, expected) in expectations {
88        let cli = Args::try_parse_from(input.split_whitespace())?;
89
90        assert_eq!(cli.service_manager, expected);
91    }
92
93    Ok(())
94}
95
96#[test]
97fn setting_system_flag() -> Result<(), Box<dyn std::error::Error>> {
98    use crate::Args;
99
100    use clap::Parser;
101
102    let expectations = [("app", false), ("app --system", true)];
103
104    for (input, expected) in expectations {
105        let cli = Args::try_parse_from(input.split_whitespace())?;
106
107        assert_eq!(cli.system, expected);
108    }
109
110    Ok(())
111}
112
113#[test]
114fn reading_cargo_env_for_defaults() -> Result<(), Box<dyn std::error::Error>> {
115    use crate::Args;
116
117    use clap::Parser;
118
119    figment::Jail::expect_with(|jail| {
120        jail.set_env("CARGO_PKG_NAME", "consumer-package");
121
122        let expectations = [
123            ("app", "consumer-package"),
124            ("app -n app-name", "app-name"),
125            ("app --name app-name", "app-name"),
126        ];
127
128        for (input, expected) in expectations {
129            let cli = Args::try_parse_from(input.split_whitespace()).expect("failed to parse");
130
131            assert_eq!(cli.name.unwrap_or_default(), expected.into());
132        }
133
134        Ok(())
135    });
136
137    Ok(())
138}