use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
pub const CLI_SPEC_VERSION: u32 = 2;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct CliSpec {
pub version: u32,
pub root: CommandSpec,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct CommandSpec {
pub name: String,
pub path: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub about: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub long_about: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub after_long_help: Option<String>,
pub hidden: bool,
pub args: Vec<ArgSpec>,
pub subcommands: Vec<CommandSpec>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct ArgSpec {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub long: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub short: Option<char>,
#[serde(skip_serializing_if = "Option::is_none")]
pub help: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub long_help: Option<String>,
pub required: bool,
pub default_values: Vec<String>,
pub possible_values: Vec<String>,
pub value_enum: bool,
pub num_args_min: usize,
pub num_args_max: Option<usize>,
pub global: bool,
pub hidden: bool,
pub positional: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub index: Option<usize>,
pub action: String,
}