use clap::{Args, Parser, Subcommand, ValueEnum};
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(name = "nginx-discover")]
#[command(author, version, about, long_about = None)]
pub struct Cli {
#[command(flatten)]
pub global: GlobalOpts,
#[command(subcommand)]
pub command: Commands,
}
#[derive(Args, Debug)]
pub struct GlobalOpts {
#[arg(short, long, global = true)]
pub config: Option<PathBuf>,
#[arg(short, long, global = true)]
pub verbose: bool,
#[arg(short, long, global = true)]
pub quiet: bool,
#[arg(long, value_enum, default_value = "auto", global = true)]
pub color: ColorChoice,
}
#[derive(Debug, Clone, ValueEnum)]
pub enum ColorChoice {
Auto,
Always,
Never,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
Parse(ParseArgs),
Extract(ExtractArgs),
Analyze(AnalyzeArgs),
Export(ExportArgs),
Doctor(DoctorArgs),
Interactive,
}
#[derive(Args, Debug)]
pub struct ParseArgs {
#[arg(short, long)]
pub tree: bool,
#[arg(short, long)]
pub summary: bool,
#[arg(long)]
pub json: bool,
}
#[derive(Args, Debug)]
pub struct ExtractArgs {
#[command(subcommand)]
pub target: ExtractTarget,
#[arg(short, long, value_enum, default_value = "table", global = true)]
pub format: OutputFormat,
#[arg(short, long, global = true)]
pub output: Option<PathBuf>,
}
#[derive(Subcommand, Debug)]
pub enum ExtractTarget {
Servers {
#[arg(long)]
ssl_only: bool,
#[arg(long)]
port: Option<u16>,
#[arg(long)]
name: Option<String>,
#[arg(short, long, value_enum)]
format: Option<OutputFormat>,
#[arg(short, long)]
output: Option<PathBuf>,
},
Logs {
#[arg(long)]
with_formats: bool,
#[arg(long)]
context: Option<String>,
#[arg(short, long, value_enum)]
format: Option<OutputFormat>,
#[arg(short, long)]
output: Option<PathBuf>,
},
Locations {
#[arg(long)]
proxy_only: bool,
#[arg(long)]
static_only: bool,
#[arg(long)]
server: Option<String>,
#[arg(short, long, value_enum)]
format: Option<OutputFormat>,
#[arg(short, long)]
output: Option<PathBuf>,
},
}
#[derive(Debug, Clone, ValueEnum)]
pub enum OutputFormat {
Table,
Json,
Yaml,
Csv,
}
#[derive(Args, Debug)]
pub struct ExportArgs {
#[arg(value_enum)]
pub format: ExportFormat,
#[arg(short, long)]
pub output: Option<PathBuf>,
#[arg(long)]
pub pretty: bool,
}
#[derive(Debug, Clone, ValueEnum)]
pub enum ExportFormat {
Json,
Yaml,
}
#[derive(Args, Debug)]
pub struct DoctorArgs {
#[arg(long)]
pub no_network: bool,
#[arg(long)]
pub fix: bool,
}
#[derive(Args, Debug)]
pub struct AnalyzeArgs {
#[command(subcommand)]
pub target: AnalyzeTarget,
}
#[derive(Subcommand, Debug)]
pub enum AnalyzeTarget {
Ssl {
#[arg(long)]
warnings_only: bool,
#[arg(long)]
check_certs: bool,
#[arg(short, long, value_enum, default_value = "table")]
format: OutputFormat,
#[arg(short, long)]
output: Option<PathBuf>,
},
Security {
#[arg(long, default_value = "info")]
level: String,
#[arg(long)]
fix: bool,
#[arg(short, long, value_enum, default_value = "table")]
format: OutputFormat,
#[arg(short, long)]
output: Option<PathBuf>,
},
}