use std::path::PathBuf;
use clap::Parser;
use url::Url;
use super::config::IdpConfiguration as PotreeAuthIdpConfiguration;
use super::config::PotreeAuthConfiguration;
#[derive(Debug, Clone, Parser)]
#[command(version, about = None, long_about = None)]
pub struct Cli {
#[arg(short, long, env = "DATA_DIR")]
pub data_dir: PathBuf,
#[clap(flatten)]
pub idp: Option<IdpConfiguration>,
#[clap(flatten)]
pub server: ServerConfiguration,
}
#[derive(Debug, Clone, clap::Args)]
#[group(requires_all = ["idp_url", "idp_client_id", "idp_client_secret", "idp_groups_claim", "idp_application_external_url"])]
pub struct IdpConfiguration {
#[arg(long, required = false, env = "IDP_URL")]
pub idp_url: Url,
#[arg(long, required = false, env = "IDP_CLIENT_ID")]
pub idp_client_id: String,
#[arg(long, required = false, env = "IDP_CLIENT_SECRET")]
pub idp_client_secret: String,
#[arg(long, required = false, env = "IDP_GROUPS_CLAIM")]
pub idp_groups_claim: String,
#[arg(long, required = false, env = "IDP_APPLICATION_EXTERNAL_URL")]
pub idp_application_external_url: Url,
}
#[derive(Debug, Clone, clap::Args)]
pub struct ServerConfiguration {
#[arg(long, default_value = "127.0.0.1", env = "SERVER_HOST")]
pub host: String,
#[arg(long, default_value_t = 3000, env = "SERVER_PORT")]
pub port: u16,
}
impl From<Cli> for PotreeAuthConfiguration {
fn from(value: Cli) -> Self {
let Cli { data_dir, idp, .. } = value;
Self {
data_dir,
idp: idp.map(Into::into),
}
}
}
impl From<IdpConfiguration> for PotreeAuthIdpConfiguration {
fn from(value: IdpConfiguration) -> Self {
let IdpConfiguration {
idp_url,
idp_client_id,
idp_client_secret,
idp_groups_claim,
idp_application_external_url,
} = value;
Self {
idp_url,
client_id: idp_client_id,
client_secret: idp_client_secret,
groups_claim: idp_groups_claim,
external_url: idp_application_external_url,
}
}
}