use clap::{Args, Parser};
use serde::{Deserialize, Serialize};
use crate::inventory::options::{OutputFormat, ParameterKeyStyle, StorageType};
#[derive(Args, Debug, Default, Serialize, Deserialize)]
#[group(multiple = false, required = true)]
pub struct CommandOptions {
#[arg(short, long)]
pub list: bool,
#[arg(short = 't', long, value_name = "HOSTNAME")]
pub host: Option<String>,
}
#[derive(Args, Debug, Default, Deserialize, Serialize)]
#[group()]
pub struct StorageOptions {
#[arg(value_enum, short, long)]
pub storage_type: Option<StorageType>,
#[arg(short = 'b', long)]
pub inventory_base_uri: Option<String>,
#[arg(short = 'u', long)]
pub nodes_uri: Option<String>,
#[arg(short = 'c', long)]
pub classes_uri: Option<String>,
#[arg(value_enum, long)]
pub parameter_key_style: Option<ParameterKeyStyle>,
#[arg(short = 'a', long)]
pub compose_node_name: bool,
#[arg(short = 'z', long)]
pub ignore_class_notfound: bool,
#[arg(short = 'x', long, value_name = "PATTERN")]
pub ignore_class_notfound_regexp: Option<Vec<String>>,
}
#[derive(Args, Debug, Default, Deserialize, Serialize)]
#[group()]
pub struct OutputOptions {
#[arg(value_enum, short, long, default_value = "json")]
pub output: OutputFormat,
#[arg(short = 'y', long)]
pub pretty_print: bool,
#[arg(long)]
pub output_sorted: bool,
#[arg(short = '0', long = "multiple-errors", conflicts_with = "single_error")]
pub group_errors: bool,
#[arg(short = '1', long = "single-error", conflicts_with = "group_errors")]
pub single_error: bool,
}
#[derive(Args, Debug, Default, Deserialize, Serialize)]
pub struct AnsibleOptions {
#[arg(long, default_value = "_hosts")]
pub applications_postfix: String,
}
#[derive(Parser, Debug, Default, Serialize, Deserialize)]
#[serde(default)]
#[command(
name = "ferroclass-ansible",
bin_name = "ferroclass-ansible",
version,
about = "Ansible dynamic inventory adapter for reclass",
after_help = "This binary implements the Ansible dynamic inventory protocol.\n\
Use --list to output the entire inventory as JSON.\n\
Use --host HOSTNAME to output host variables for a specific node."
)]
pub struct Cli {
#[arg(short, long)]
pub verbose: bool,
#[command(flatten, next_help_heading = "Ansible options")]
pub ansible_options: AnsibleOptions,
#[command(flatten, next_help_heading = "Database options")]
pub storage_options: StorageOptions,
#[command(flatten, next_help_heading = "Output options")]
pub output_options: OutputOptions,
#[command(flatten, next_help_heading = "Modes")]
pub command_options: CommandOptions,
}