use std::path::PathBuf;
use clap::Args;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum K8sVersionFallback {
Auto,
Window(u32),
}
impl std::str::FromStr for K8sVersionFallback {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
if s.eq_ignore_ascii_case("auto") {
Ok(K8sVersionFallback::Auto)
} else {
s.parse::<u32>()
.map(K8sVersionFallback::Window)
.map_err(|err| format!("expected `auto` or a non-negative integer: {err}"))
}
}
}
#[derive(Args, Debug, Clone)]
pub struct K8sArgs {
#[arg(long = "k8s-version", default_values_t = vec![String::from("v1.35.0")])]
pub k8s_version: Vec<String>,
#[arg(long = "k8s-version-fallback", conflicts_with = "strict_k8s_version")]
pub k8s_version_fallback: Option<K8sVersionFallback>,
#[arg(long = "k8s-schema-mirror")]
pub k8s_schema_mirror: Vec<String>,
#[arg(long = "k8s-schema-cache-dir")]
pub k8s_schema_cache_dir: Option<PathBuf>,
#[arg(long = "no-cache")]
pub no_cache: bool,
#[arg(long = "strict-k8s-version")]
pub strict_k8s_version: bool,
#[arg(long)]
pub offline: bool,
#[arg(long = "no-k8s-schemas")]
pub no_k8s_schemas: bool,
}
impl K8sArgs {
pub fn resolved_fallback_window(&self) -> Result<Option<u32>, String> {
if self.strict_k8s_version {
return Ok(None);
}
match &self.k8s_version_fallback {
None | Some(K8sVersionFallback::Window(0)) => Ok(None),
Some(K8sVersionFallback::Window(n)) => Ok(Some(*n)),
Some(K8sVersionFallback::Auto) => {
if self.k8s_version.len() != 1 {
return Err(
"--k8s-version-fallback=auto requires exactly one --k8s-version"
.to_string(),
);
}
Ok(Some(DEFAULT_AUTO_WINDOW))
}
}
}
}
pub const DEFAULT_AUTO_WINDOW: u32 = 15;