cronback_cli/triggers/
run.rs

1use 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    /// Trigger name
13    name: String,
14
15    /// (or --wait) Awaits the run to complete
16    #[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}