use clap::{Args, Subcommand};
use serde::Serialize;
use boomack::client::types::{
get_type_ids_request,
get_type_request,
set_type_request,
delete_type_request,
};
use super::structs::load_structure;
use super::{CliConfig, run_request};
#[derive(Args, Serialize)]
pub struct TypeCommandArguments {
#[clap(subcommand)]
command: Option<TypeSubCommands>,
}
#[derive(Subcommand, Serialize)]
pub enum TypeSubCommands {
#[clap(name = "ls", about = "List all media types")]
List,
#[clap(about = "Get a media type")]
Get(TypeIdArguments),
#[clap(about = "Create a new media type")]
Add(TypeUpdateArguments),
#[clap(about = "Update a media type")]
Set(TypeUpdateArguments),
#[clap(alias = "rm", about = "Delete a media type")]
Delete(TypeIdArguments),
}
#[derive(Args, Serialize)]
pub struct TypeIdArguments {
#[clap(value_name = "TYPE_ID",
help = "The ID of the type")]
type_id: String,
}
#[derive(Args, Serialize)]
pub struct TypeUpdateArguments {
#[clap(value_name = "TYPE_ID",
help = "The ID of the media type")]
type_id: String,
#[clap(value_name = "TYPE_DEFINITION",
help = "A YAML/JSON encoded type definition, a path to a YAML/JSON file, or 'STDIN'")]
options: String,
}
pub fn dispatch_type_command(cfg: &CliConfig, args: &TypeCommandArguments) -> i32 {
let mut stdin_consumed = false;
let request = if let Some(sub_command) = &args.command {
match sub_command {
TypeSubCommands::List => get_type_ids_request(),
TypeSubCommands::Get(args) => get_type_request(&args.type_id),
TypeSubCommands::Add(args) => set_type_request(&args.type_id,
load_structure(&args.options, true, &mut stdin_consumed)),
TypeSubCommands::Set(args) => set_type_request(&args.type_id,
load_structure(&args.options, true, &mut stdin_consumed)),
TypeSubCommands::Delete(args) => delete_type_request(&args.type_id),
}
} else {
get_type_ids_request()
};
run_request(cfg, request)
}