cronback_cli/triggers/
run.rs1use anyhow::Result;
2use async_trait::async_trait;
3use clap::Parser;
4use cronback_api_model::RunMode;
5use spinners::{Spinner, Spinners};
6
7use crate::args::CommonOptions;
8use crate::{confirm_or_abort, emitln, Command};
9
10#[derive(Clone, Debug, Parser)]
11pub struct RunArgs {
12 name: String,
14
15 #[arg(long, short, alias = "wait")]
17 r#await: bool,
18}
19
20#[async_trait]
21impl Command for RunArgs {
22 async fn run<
23 A: tokio::io::AsyncWrite + Send + Sync + Unpin,
24 B: tokio::io::AsyncWrite + Send + Sync + Unpin,
25 >(
26 &self,
27 out: &mut tokio::io::BufWriter<A>,
28 _err: &mut tokio::io::BufWriter<B>,
29 common_options: &CommonOptions,
30 ) -> Result<()> {
31 confirm_or_abort!(
32 common_options,
33 "Are you sure you want to run the trigger '{}' immediately?",
34 self.name
35 );
36
37 let client = common_options.new_client()?;
38 let mode = if self.r#await {
39 RunMode::Sync
40 } else {
41 RunMode::Async
42 };
43
44 let spinner = if mode == RunMode::Sync {
45 Some(Spinner::new(
46 Spinners::Dots9,
47 "Awaiting the run to complete...".to_owned(),
48 ))
49 } else {
50 None
51 };
52
53 let response =
54 cronback_client::triggers::run(&client, &self.name, mode).await?;
55 if let Some(mut spinner) = spinner {
56 spinner.stop_with_message("".to_string());
57 }
58
59 let response = response.into_inner();
60 match response {
61 | Ok(good) => {
62 let json = serde_json::to_value(good)?;
63 let colored = colored_json::to_colored_json_auto(&json)?;
64 emitln!(out, "{}", colored);
65 }
66 | Err(bad) => {
67 return Err(bad.into());
68 }
69 };
70 Ok(())
71 }
72}