use std::path::PathBuf;
use clap::{ArgAction, Args, 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(GenerateCommand),
}
#[derive(Args, Debug, Clone)]
#[allow(clippy::struct_excessive_bools)]
pub struct GenerateCommand {
#[arg(value_enum, default_value = "types")]
pub mode: GenerateMode,
#[arg(
short,
long,
value_name = "FILE",
value_hint = ValueHint::AnyPath,
display_order = 0,
help_heading = "Required"
)]
pub input: PathBuf,
#[arg(
short,
long,
value_name = "PATH",
value_hint = ValueHint::AnyPath,
display_order = 0,
help_heading = "Required"
)]
pub output: Option<PathBuf>,
#[arg(
short = 'C',
long,
value_name = "PUB",
default_value = "public",
display_order = 10,
help_heading = "Code Generation"
)]
pub visibility: Visibility,
#[arg(long, default_value_t = false, display_order = 11, help_heading = "Code Generation")]
pub odata_support: bool,
#[arg(
long,
value_enum,
default_value_t,
display_order = 12,
help_heading = "Code Generation"
)]
pub enum_mode: EnumCaseMode,
#[arg(
long,
value_enum,
default_value_t,
display_order = 12,
help_heading = "Code Generation"
)]
pub enum_layout: EnumLayout,
#[arg(long, default_value_t = false, display_order = 13, help_heading = "Code Generation")]
pub no_helpers: bool,
#[arg(
short = 'c',
long = "customize",
action = ArgAction::Append,
value_name = "TYPE=PATH",
display_order = 14,
help_heading = "Code Generation"
)]
pub customize: Option<Vec<String>>,
#[arg(
group = "filter",
long,
default_value_t = false,
display_order = 22,
help_heading = "Operation Filtering"
)]
pub all_schemas: bool,
#[arg(long, default_value_t = false, display_order = 15, help_heading = "Code Generation")]
pub all_headers: bool,
#[arg(long, default_value_t = false, display_order = 16, help_heading = "Code Generation")]
pub enable_builders: bool,
#[arg(long, default_value_t = false, display_order = 18, help_heading = "Code Generation")]
pub no_ordered_collections: bool,
#[arg(long, default_value_t = false, display_order = 17, help_heading = "Code Generation")]
pub doc_format: bool,
#[arg(
group = "filter",
long, action = ArgAction::Append,
value_name = "id_1,id_2,...",
value_delimiter = ',',
display_order = 20,
help_heading = "Operation Filtering"
)]
pub 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"
)]
pub exclude: Option<Vec<String>>,
#[arg(
short,
long,
default_value_t = false,
global = true,
display_order = 100,
help_heading = "Terminal Output"
)]
pub verbose: bool,
#[arg(
short,
long,
default_value_t = false,
global = true,
display_order = 101,
help_heading = "Terminal Output"
)]
pub quiet: bool,
}
#[derive(ValueEnum, Clone, Debug, PartialEq, Eq)]
pub enum GenerateMode {
Types,
Client,
#[value(name = "client-mod")]
ClientMod,
#[value(name = "server-mod")]
ServerMod,
}
#[derive(ValueEnum, Clone, Debug, Default)]
pub enum EnumCaseMode {
#[default]
Merge,
Preserve,
Relaxed,
}
#[derive(ValueEnum, Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum EnumLayout {
#[default]
Spec,
Sorted,
}
#[derive(Subcommand, Debug)]
pub enum ListCommands {
Operations {
#[arg(short, long, value_name = "FILE", value_hint = ValueHint::AnyPath)]
input: PathBuf,
},
}