use clap::{Parser, ValueEnum};
pub const DEFAULT_MAX_BYTES: usize = 100 * 1024;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, ValueEnum)]
#[value(rename_all = "lower")]
pub enum SchemeOverride {
#[default]
Auto,
Http,
Https,
}
impl SchemeOverride {
pub fn fixed(self) -> Option<&'static str> {
match self {
SchemeOverride::Auto => None,
SchemeOverride::Http => Some("http"),
SchemeOverride::Https => Some("https"),
}
}
}
#[derive(Parser)]
#[command(name = "httpcan")]
#[command(about = "A simple HTTP request & response service", long_about = None)]
#[command(version)]
pub struct Args {
#[arg(short, long, env = "HTTPCAN_PORT", default_value_t = 8080)]
pub port: u16,
#[arg(
long,
value_enum,
env = "HTTPCAN_OPENAPI_SERVERS",
default_value = "current-first"
)]
pub openapi_servers: OpenapiServers,
#[arg(long, env = "HTTPCAN_EXCLUDE_HEADERS")]
pub exclude_headers: Option<String>,
#[arg(long, env = "HTTPCAN_MAX_BYTES", default_value_t = DEFAULT_MAX_BYTES)]
pub max_bytes: usize,
#[arg(
long,
value_enum,
env = "HTTPCAN_CANONICAL_SCHEME",
default_value = "auto"
)]
pub canonical_scheme: SchemeOverride,
#[arg(long, value_name = "DIR", env = "HTTPCAN_STATIC_DIR")]
pub static_dir: Option<String>,
#[arg(
long,
env = "HTTPCAN_OAUTH2_CLIENTS",
value_name = "ID:SECRET[,ID:SECRET...]"
)]
pub oauth2_clients: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, ValueEnum)]
pub enum OpenapiServers {
#[default]
CurrentFirst,
SpecOnly,
}
impl OpenapiServers {
pub fn add_current_server(self) -> bool {
matches!(self, OpenapiServers::CurrentFirst)
}
}