use std::net::SocketAddr;
use clap::Args;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Args, Serialize, Deserialize)]
pub struct OperatorConfig {
#[arg(long, env = "WATCH_NAMESPACES", value_delimiter = ',', num_args = 0..)]
pub watch_namespaces: Vec<String>,
#[arg(long, env = "OPERATOR_NAMESPACE", default_value = "crabka-operator")]
pub operator_namespace: String,
#[arg(long, env = "LEASE_NAME", default_value = "crabka-operator-leader")]
pub lease_name: String,
#[arg(long, env = "POD_NAME", default_value = "crabka-operator-local")]
pub pod_name: String,
#[arg(long, env = "HEALTH_ADDR", default_value = "0.0.0.0:8080")]
pub health_addr: SocketAddr,
#[arg(
long,
env = "RUST_LOG",
default_value = "info,kube_client::client::builder=warn"
)]
pub log_filter: String,
#[arg(long, env = "DEFAULT_BROKER_IMAGE")]
pub default_broker_image: Option<String>,
#[arg(long, env = "DEFAULT_GATEWAY_IMAGE")]
pub default_gateway_image: Option<String>,
#[arg(long, env = "DEFAULT_SCHEMA_REGISTRY_IMAGE")]
pub default_schema_registry_image: Option<String>,
}
impl OperatorConfig {
#[must_use]
pub fn watched(&self) -> Option<&[String]> {
if self.watch_namespaces.is_empty() {
None
} else {
Some(&self.watch_namespaces)
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use assert2::assert;
use clap::Parser;
#[derive(Parser)]
struct Wrap {
#[command(flatten)]
cfg: OperatorConfig,
}
#[test]
fn cli_defaults_compute_cluster_scope() {
let parsed = Wrap::parse_from(["bin"]);
assert!(parsed.cfg.watched().is_none());
assert!(parsed.cfg.operator_namespace == "crabka-operator");
}
#[test]
fn comma_separated_namespaces_parse() {
let parsed = Wrap::parse_from(["bin", "--watch-namespaces=a,b,c"]);
assert!(parsed.cfg.watch_namespaces == vec!["a", "b", "c"]);
assert!(parsed.cfg.watched().is_some());
}
}