stormchaser_cli/commands/runs/
mod.rs1use anyhow::Result;
2use clap::Subcommand;
3
4pub mod approve;
5pub mod artifacts;
6pub mod enqueue;
7pub mod get;
8pub mod list;
9pub mod logs;
10pub mod reports;
11pub mod watch;
12
13#[derive(Subcommand)]
14pub enum RunCommands {
15 List {
17 #[arg(long)]
18 owner: Option<String>,
19 #[arg(long)]
20 name: Option<String>,
21 #[arg(long)]
22 repo_url: Option<String>,
23 #[arg(long)]
24 workflow_path: Option<String>,
25 #[arg(long)]
26 created_after: Option<String>,
27 #[arg(long)]
28 created_before: Option<String>,
29 #[arg(long)]
30 status: Option<String>,
31 },
32 Get { id: stormchaser_model::RunId },
34 Artifacts { id: stormchaser_model::RunId },
36 Reports { id: stormchaser_model::RunId },
38 Report {
40 id: stormchaser_model::RunId,
41 #[arg(long)]
42 report_id: stormchaser_model::TestReportId,
43 },
44 Logs {
46 id: stormchaser_model::RunId,
47 #[arg(long)]
48 step_name: String,
49 },
50 Watch { id: stormchaser_model::RunId },
52 Enqueue {
54 workflow_name: String,
55 #[arg(long)]
56 repo: String,
57 #[arg(long)]
58 path: String,
59 #[arg(long)]
60 git_ref: String,
61 #[arg(short, long)]
63 input: Vec<String>,
64 #[arg(long, default_value_t = false)]
66 tail: bool,
67 #[arg(long, default_value_t = false)]
69 watch: bool,
70 },
71 Pending,
73 Approve {
75 run_id: stormchaser_model::RunId,
76 step_id: stormchaser_model::StepInstanceId,
77 #[arg(short, long)]
79 input: Vec<String>,
80 },
81 Reject {
83 run_id: stormchaser_model::RunId,
84 step_id: stormchaser_model::StepInstanceId,
85 },
86 ApproveLink { token: String },
88}
89
90pub async fn handle(
91 url: &str,
92 token: Option<&str>,
93 http_client: &reqwest_middleware::ClientWithMiddleware,
94 command: RunCommands,
95) -> Result<()> {
96 match command {
97 RunCommands::List {
98 owner,
99 name,
100 repo_url,
101 workflow_path,
102 created_after,
103 created_before,
104 status,
105 } => {
106 list::list_runs(
107 url,
108 token,
109 http_client,
110 list::ListRunsFilters {
111 owner,
112 name,
113 repo_url,
114 workflow_path,
115 created_after,
116 created_before,
117 status,
118 },
119 )
120 .await
121 }
122 RunCommands::Get { id } => get::get_run(url, token, http_client, id).await,
123 RunCommands::Artifacts { id } => {
124 artifacts::list_artifacts(url, token, http_client, id).await
125 }
126 RunCommands::Reports { id } => reports::list_reports(url, token, http_client, id).await,
127 RunCommands::Report { id, report_id } => {
128 reports::get_report(url, token, http_client, id, report_id).await
129 }
130 RunCommands::Logs { id, step_name } => {
131 logs::stream_logs(url, token, http_client, id, step_name).await
132 }
133 RunCommands::Watch { id } => watch::watch_run(url, token, http_client, id).await,
134 RunCommands::Enqueue {
135 workflow_name,
136 repo,
137 path,
138 git_ref,
139 input,
140 tail,
141 watch,
142 } => {
143 enqueue::enqueue_run(
144 url,
145 token,
146 http_client,
147 enqueue::EnqueueRunParams {
148 workflow_name,
149 repo,
150 path,
151 git_ref,
152 input,
153 tail,
154 watch,
155 },
156 )
157 .await
158 }
159 RunCommands::Approve {
160 run_id,
161 step_id,
162 input,
163 } => approve::approve_step(url, token, http_client, run_id, step_id, input).await,
164 RunCommands::Reject { run_id, step_id } => {
165 approve::reject_step(url, token, http_client, run_id, step_id).await
166 }
167 RunCommands::ApproveLink { token: link_token } => {
168 approve::approve_link(url, http_client, link_token).await
169 }
170 RunCommands::Pending => approve::list_pending(url, token, http_client).await,
171 }
172}
173
174#[cfg(test)]
175mod tests {
176 use super::*;
177
178 fn build_dummy_client() -> reqwest_middleware::ClientWithMiddleware {
179 reqwest_middleware::ClientBuilder::new(reqwest::Client::new()).build()
180 }
181
182 #[tokio::test]
183 async fn test_handle_commands() {
184 let client = build_dummy_client();
185 let url = "http://127.0.0.1:1"; let token = Some("test_token");
187 let id = stormchaser_model::RunId::new_v4();
188
189 let commands = vec![
190 RunCommands::List {
191 owner: None,
192 name: None,
193 repo_url: None,
194 workflow_path: None,
195 created_after: None,
196 created_before: None,
197 status: None,
198 },
199 RunCommands::Get { id },
200 RunCommands::Artifacts { id },
201 RunCommands::Reports { id },
202 RunCommands::Report {
203 id,
204 report_id: stormchaser_model::TestReportId::new_v4(),
205 },
206 RunCommands::Logs {
207 id,
208 step_name: "test".to_string(),
209 },
210 RunCommands::Watch { id },
211 RunCommands::Enqueue {
212 workflow_name: "test".to_string(),
213 repo: "test".to_string(),
214 path: "test".to_string(),
215 git_ref: "test".to_string(),
216 input: vec![],
217 tail: false,
218 watch: false,
219 },
220 RunCommands::Approve {
221 run_id: id,
222 step_id: stormchaser_model::StepInstanceId::new_v4(),
223 input: vec![],
224 },
225 RunCommands::Reject {
226 run_id: id,
227 step_id: stormchaser_model::StepInstanceId::new_v4(),
228 },
229 RunCommands::ApproveLink {
230 token: "dummy".to_string(),
231 },
232 RunCommands::Pending,
233 ];
234
235 for cmd in commands {
236 let _ = handle(url, token, &client, cmd).await;
237 }
240 }
241}