fido/integrations/zendesk/
cli.rs

1//! Using Zendesk
2
3use clap::{Arg, ArgMatches, Command};
4use figment::Figment;
5use serde::Deserialize;
6use zendesk::resources::tickets::handlers::get_ticket;
7
8use crate::Context;
9
10/// Auth config
11#[derive(Deserialize)]
12struct Config {
13    /// Base URL of the instance
14    base_url: String,
15    /// Account email
16    email: String,
17    /// Auth token
18    api_token: String,
19    /// OAUTH application client ID
20    oauth_client_id: String,
21}
22
23/// Build the Clap command
24pub(crate) fn build_command() -> Command {
25    Command::new("zendesk")
26        .about("Interact with Zendesk")
27        .subcommand(
28            Command::new("tickets")
29                .about("Interact with tickets")
30                .subcommand(
31                    Command::new("get")
32                        .about("Get ticket")
33                        .long_about("Get a ticket from Zendesk")
34                        .arg(Arg::new("ticket-number").help("Ticket number")),
35                ),
36        )
37}
38
39/// Process parsed matches and dispatch to functions
40pub(crate) async fn process_matches(config_builder: Figment, matches: &ArgMatches) {
41    let context = Context::from_matches(matches);
42    let config: Config = config_builder.select("zendesk").extract().unwrap();
43    let mut client = zendesk::Client::new(
44        config.base_url,
45        config.email,
46        config.api_token,
47        config.oauth_client_id,
48    );
49
50    if let Some(matches) = matches.subcommand_matches("tickets") {
51        if let Some(matches) = matches.subcommand_matches("get") {
52            if let Some(ticket_number) = matches.get_one::<String>("ticket-number") {
53                client.update_token().await;
54                let ticket = get_ticket(client, ticket_number).await.unwrap();
55                if !context.quiet {
56                    println!("{ticket:#?}");
57                }
58            }
59        }
60    }
61}