use std::path::PathBuf;
use clap::{ArgAction, Parser, Subcommand, ValueEnum, ValueHint, builder::Styles};
use super::colors::{ColorMode, ThemeMode};
use crate::{generator::codegen::Visibility, ui::Colors};
const DARK_STYLE: Styles = Colors::clap_styles();
#[derive(Parser, Debug)]
#[command(name = "oas3-gen")]
#[command(author, version, about = "OpenAPI to Rust code generator")]
#[command(propagate_version = true)]
#[command(styles = DARK_STYLE)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
#[arg(
long,
value_enum,
value_name = "WHEN",
default_value = "auto",
global = true,
display_order = 100,
help_heading = "Terminal Output"
)]
pub color: ColorMode,
#[arg(
long,
value_enum,
value_name = "THEME",
default_value = "auto",
global = true,
display_order = 100,
help_heading = "Terminal Output"
)]
pub theme: ThemeMode,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
List {
#[command(subcommand)]
list_command: ListCommands,
},
Generate {
#[arg(value_enum, default_value = "types")]
mode: GenerateMode,
#[arg(
short,
long,
value_name = "FILE",
value_hint = ValueHint::AnyPath,
display_order = 0,
help_heading = "Required"
)]
input: PathBuf,
#[arg(
short,
long,
value_name = "FILE",
value_hint = ValueHint::AnyPath,
display_order = 0,
help_heading = "Required"
)]
output: PathBuf,
#[arg(
short = 'C',
long,
value_name = "PUB",
default_value = "public",
display_order = 10,
help_heading = "Code Generation"
)]
visibility: Visibility,
#[arg(long, default_value_t = false, display_order = 11, help_heading = "Code Generation")]
odata_support: bool,
#[arg(
group = "filter",
long,
default_value_t = false,
display_order = 22,
help_heading = "Operation Filtering"
)]
all_schemas: bool,
#[arg(
group = "filter",
long, action = ArgAction::Append,
value_name = "id_1,id_2,...",
value_delimiter = ',',
display_order = 20,
help_heading = "Operation Filtering"
)]
only: Option<Vec<String>>,
#[arg(
group = "filter",
long, action = ArgAction::Append,
value_name = "id_1,id_2,...",
value_delimiter = ',',
display_order = 21,
help_heading = "Operation Filtering"
)]
exclude: Option<Vec<String>>,
#[arg(
short,
long,
default_value_t = false,
global = true,
display_order = 100,
help_heading = "Terminal Output"
)]
verbose: bool,
#[arg(
short,
long,
default_value_t = false,
global = true,
display_order = 101,
help_heading = "Terminal Output"
)]
quiet: bool,
},
}
#[derive(ValueEnum, Clone, Debug)]
pub enum GenerateMode {
Types,
Client,
}
#[derive(Subcommand, Debug)]
pub enum ListCommands {
Operations {
#[arg(short, long, value_name = "FILE", value_hint = ValueHint::AnyPath)]
input: PathBuf,
},
}