use std::path::PathBuf;
use clap::{Parser, Subcommand, ValueEnum};
#[derive(Parser, Debug)]
#[command(name = "mitm2openapi", version, about)]
pub struct Cli {
#[command(subcommand)]
pub command: Command,
}
#[derive(Subcommand, Debug)]
pub enum Command {
Discover(DiscoverArgs),
Generate(GenerateArgs),
}
#[derive(ValueEnum, Clone, Debug, Default)]
pub enum InputFormat {
#[default]
Auto,
Har,
Mitmproxy,
}
fn parse_byte_size(s: &str) -> Result<u64, String> {
let s = s.trim();
let (num_str, multiplier) = if let Some(n) = s.strip_suffix("GiB") {
(n.trim(), 1024 * 1024 * 1024u64)
} else if let Some(n) = s.strip_suffix("MiB") {
(n.trim(), 1024 * 1024u64)
} else if let Some(n) = s.strip_suffix("KiB") {
(n.trim(), 1024u64)
} else {
(s, 1u64)
};
num_str
.parse::<u64>()
.map(|n| n * multiplier)
.map_err(|e| format!("invalid size: {e}"))
}
#[derive(Parser, Debug)]
pub struct DiscoverArgs {
#[arg(short, long)]
pub input: PathBuf,
#[arg(short, long)]
pub output: PathBuf,
#[arg(short, long)]
pub prefix: String,
#[arg(long, value_enum, default_value_t = InputFormat::Auto)]
pub format: InputFormat,
#[arg(long, value_delimiter = ',')]
pub exclude_patterns: Vec<String>,
#[arg(long, value_delimiter = ',')]
pub include_patterns: Vec<String>,
#[arg(long, value_parser = parse_byte_size, default_value = "2GiB")]
pub max_input_size: u64,
#[arg(long, default_value_t = false)]
pub allow_symlinks: bool,
}
#[derive(Parser, Debug)]
pub struct GenerateArgs {
#[arg(short, long)]
pub input: PathBuf,
#[arg(short, long)]
pub templates: PathBuf,
#[arg(short, long)]
pub output: PathBuf,
#[arg(short, long)]
pub prefix: String,
#[arg(long, value_enum, default_value_t = InputFormat::Auto)]
pub format: InputFormat,
#[arg(long)]
pub param_regex: Option<String>,
#[arg(long)]
pub openapi_title: Option<String>,
#[arg(long, default_value = "1.0.0")]
pub openapi_version: String,
#[arg(long)]
pub exclude_headers: Option<String>,
#[arg(long)]
pub exclude_cookies: Option<String>,
#[arg(long)]
pub include_headers: bool,
#[arg(long)]
pub ignore_images: bool,
#[arg(long)]
pub suppress_params: bool,
#[arg(long)]
pub tags_overrides: Option<String>,
#[arg(long, value_parser = parse_byte_size, default_value = "2GiB")]
pub max_input_size: u64,
#[arg(long, value_parser = parse_byte_size, default_value = "256MiB")]
pub max_payload_size: u64,
#[arg(long, default_value_t = 256)]
pub max_depth: usize,
#[arg(long, value_parser = parse_byte_size, default_value = "64MiB")]
pub max_body_size: u64,
#[arg(long, default_value_t = false)]
pub allow_symlinks: bool,
}