zero-cli 1.0.1

A command line tool for Zero Secrets Manager
mod graphql;
use crate::common::{
    authorization_headers::authorization_headers,
    execute_graphql_request::execute_graphql_request,
    keyring::keyring,
    print_formatted_error::print_formatted_error,
    query_full_id::{query_full_id, QueryType},
};
use crate::projects::delete::graphql::delete_project::{delete_project, DeleteProject};
use clap::Args;
use dialoguer::{theme::ColorfulTheme, Input};
use graphql_client::GraphQLQuery;
use reqwest::Client;
use termimad::crossterm::style::Stylize;

#[derive(Args, Debug)]
pub struct ProjectsDeleteArgs {
    #[clap(
        short,
        long,
        help = "Project ID (First 4 characters or more are allowed)"
    )]
    id: String,
    #[clap(
        short,
        long,
        help = "Access token, if not specified, the token will be taken from the keychain"
    )]
    access_token: Option<String>,
}

pub fn delete(args: &ProjectsDeleteArgs) {
    let access_token = match &args.access_token {
        Some(token) => token.clone(),
        None => keyring::get("access_token"),
    };

    let project_id = query_full_id(QueryType::Project, args.id.clone(), &access_token);

    match Input::with_theme(&ColorfulTheme::default())
        .with_prompt(format!(
            "Type {} to confirm deletion:",
            project_id.clone().to_string()[..4].green()
        ))
        .validate_with(|input: &String| -> Result<(), &str> {
            if input == &project_id.clone().to_string()[..4] {
                Ok(())
            } else {
                Err("Your reply was invalid.")
            }
        })
        .interact()
    {
        Ok(value) => value.trim().to_string(),

        Err(_) => {
            print_formatted_error("Failed to read the value.");
            std::process::exit(1);
        }
    };

    let delete_project_error_message = "Failed to delete a project.";

    let delete_project_response =
        execute_graphql_request::<delete_project::Variables, delete_project::ResponseData>(
            authorization_headers(&access_token),
            DeleteProject::build_query,
            &Client::new(),
            delete_project_error_message,
            delete_project::Variables {
                object: delete_project::DeleteProjectsInput {
                    delete_secrets_on3rd_party: None,
                    ids: vec![project_id],
                },
            },
        )
        .delete_projects;

    match delete_project_response {
        Some(project) => {
            if project.affected_rows > 0 {
                project.affected_rows
            } else {
                print_formatted_error(&delete_project_error_message);
                std::process::exit(1);
            }
        }

        None => {
            print_formatted_error(&delete_project_error_message);
            std::process::exit(1);
        }
    };

    println!("{} {}", "".green(), "Project successfully deleted.");
}