support_kit/args/
service_args.rs1use clap::Parser;
2
3use super::ServiceCommand;
4
5#[derive(Clone, Debug, Default, Parser, PartialEq)]
6#[clap(rename_all = "kebab-case")]
7pub struct ServiceArgs {
8 #[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}