boomack-cli 0.5.0

CLI client for Boomack
use clap::{Args, Subcommand};
use serde::Serialize;
use boomack::client::presets::{
    get_preset_ids_request,
    get_preset_request,
    set_preset_request,
    delete_preset_request,
};
use super::structs::load_structure;
use super::{CliConfig, run_request};

#[derive(Args, Serialize)]
pub struct PresetCommandArguments {
    #[clap(subcommand)]
    command: Option<PresetSubCommands>,
}

#[derive(Subcommand, Serialize)]
pub enum PresetSubCommands {
    #[clap(name = "ls", about = "List all presets")]
    List,

    #[clap(about = "Get a preset")]
    Get(PresetIdArguments),

    #[clap(about = "Create a new preset")]
    Add(PresetUpdateArguments),

    #[clap(about = "Update a preset")]
    Set(PresetUpdateArguments),

    #[clap(alias = "rm", about = "Delete a preset")]
    Delete(PresetIdArguments),
}

#[derive(Args, Serialize)]
pub struct PresetIdArguments {
    #[clap(value_name = "PRESET_ID",
        help = "The ID of the preset")]
    preset_id: String,
}

#[derive(Args, Serialize)]
pub struct PresetUpdateArguments {
    #[clap(value_name = "PRESET_ID",
        help = "The ID of the preset")]
    preset_id: String,

    #[clap(value_name = "PRESET",
        help = "A YAML/JSON encoded display options map, a path to a YAML/JSON file, or 'STDIN'")]
    options: String,
}

pub fn dispatch_preset_command(cfg: &CliConfig, args: &PresetCommandArguments) -> i32 {
    let mut stdin_consumed = false;
    let request = if let Some(sub_command) = &args.command {
        match sub_command {
            PresetSubCommands::List => get_preset_ids_request(),
            PresetSubCommands::Get(args) => get_preset_request(&args.preset_id),
            PresetSubCommands::Add(args) => set_preset_request(&args.preset_id,
                load_structure(&args.options, true, &mut stdin_consumed)),
            PresetSubCommands::Set(args) => set_preset_request(&args.preset_id,
                load_structure(&args.options, true, &mut stdin_consumed)),
            PresetSubCommands::Delete(args) => delete_preset_request(&args.preset_id),
        }
    } else {
        get_preset_ids_request()
    };
    run_request(cfg, request)
}