use std::path::PathBuf;
use clap::{ArgGroup, Args, Parser, Subcommand};
#[derive(Subcommand, Debug, Clone)]
pub enum EdgeMode {
Edge(EdgeArgs),
Offline(OfflineArgs),
}
pub enum EdgeArg {
Redis(String),
InMemory,
}
impl From<EdgeArgs> for EdgeArg {
fn from(value: EdgeArgs) -> Self {
if let Some(redis_url) = value.redis_url {
return EdgeArg::Redis(redis_url);
};
EdgeArg::InMemory
}
}
#[derive(Args, Debug, Clone)]
#[command(group(
ArgGroup::new("data-provider")
.args(["redis_url"]),
))]
pub struct EdgeArgs {
#[clap(short, long, env)]
pub upstream_url: String,
#[clap(short, long, env)]
pub redis_url: Option<String>,
#[clap(short, long, env, default_value_t = 60)]
pub metrics_interval_seconds: u64,
#[clap(short, long, env, default_value_t = 10)]
pub features_refresh_interval_seconds: i64,
#[clap(short, long, env)]
pub tokens: Vec<String>,
}
#[derive(Args, Debug, Clone)]
pub struct OfflineArgs {
#[clap(short, long, env)]
pub bootstrap_file: Option<PathBuf>,
#[clap(short, long, env, value_delimiter = ',')]
pub tokens: Vec<String>,
}
#[derive(Parser, Debug, Clone)]
pub struct CliArgs {
#[clap(flatten)]
pub http: HttpServerArgs,
#[command(subcommand)]
pub mode: EdgeMode,
#[clap(long, env, default_value_t = ulid::Ulid::new().to_string())]
pub instance_id: String,
#[clap(short, long, env, default_value = "unleash-edge")]
pub app_name: String,
}
#[derive(Args, Debug, Clone)]
pub struct TlsOptions {
#[clap(env, long, default_value_t = false)]
pub tls_enable: bool,
#[clap(env, long)]
pub tls_server_key: Option<PathBuf>,
#[clap(env, long)]
pub tls_server_cert: Option<PathBuf>,
#[clap(env, long, default_value_t = 3043)]
pub tls_server_port: u16,
}
#[derive(Args, Debug, Clone)]
pub struct HttpServerArgs {
#[clap(short, long, env, default_value_t = 3063)]
pub port: u16,
#[clap(short, long, env, default_value = "0.0.0.0")]
pub interface: String,
#[clap(short, long, env, default_value_t = num_cpus::get_physical())]
pub workers: usize,
#[clap(flatten)]
pub tls: TlsOptions,
}
impl HttpServerArgs {
pub fn http_server_tuple(&self) -> (String, u16) {
(self.interface.clone(), self.port)
}
pub fn https_server_tuple(&self) -> (String, u16) {
(self.interface.clone(), self.tls.tls_server_port)
}
}