use std::path::PathBuf; use crate::errors::DepotError; use std::fs; #[derive(Debug, knuffel::Decode, Clone)] pub struct Config { #[knuffel(child)] pub server: ServerConfig, #[knuffel(child)] pub repository: RepositoryConfig, #[knuffel(child)] pub telemetry: Option, #[knuffel(child)] pub publishers: Option, #[knuffel(child)] pub admin: Option, #[knuffel(child)] pub oauth2: Option, } #[derive(Debug, knuffel::Decode, Clone)] pub struct ServerConfig { #[knuffel(child, unwrap(arguments))] pub bind: Vec, #[knuffel(child, unwrap(argument))] pub workers: Option, #[knuffel(child, unwrap(argument))] pub max_connections: Option, #[knuffel(child, unwrap(argument))] pub reuseport: Option, #[knuffel(child, unwrap(argument))] pub tls_cert: Option, #[knuffel(child, unwrap(argument))] pub tls_key: Option, } #[derive(Debug, knuffel::Decode, Clone)] pub struct RepositoryConfig { #[knuffel(child, unwrap(argument))] pub root: PathBuf, #[knuffel(child, unwrap(argument))] pub mode: Option, } #[derive(Debug, knuffel::Decode, Clone)] pub struct TelemetryConfig { #[knuffel(child, unwrap(argument))] pub otlp_endpoint: Option, #[knuffel(child, unwrap(argument))] pub service_name: Option, #[knuffel(child, unwrap(argument))] pub log_format: Option, } #[derive(Debug, knuffel::Decode, Clone)] pub struct PublishersConfig { #[knuffel(child, unwrap(arguments))] pub list: Vec, } #[derive(Debug, knuffel::Decode, Clone)] pub struct AdminConfig { #[knuffel(child, unwrap(argument))] pub unix_socket: Option, } #[derive(Debug, knuffel::Decode, Clone)] pub struct Oauth2Config { #[knuffel(child, unwrap(argument))] pub issuer: Option, #[knuffel(child, unwrap(argument))] pub jwks_uri: Option, #[knuffel(child, unwrap(arguments))] pub required_scopes: Option>, } impl Config { pub fn load(path: Option) -> crate::errors::Result { let path = path.unwrap_or_else(|| PathBuf::from("pkg6depotd.kdl")); let content = fs::read_to_string(&path) .map_err(|e| DepotError::Config(format!("Failed to read config file {:?}: {}", path, e)))?; knuffel::parse(path.to_str().unwrap_or("pkg6depotd.kdl"), &content) .map_err(|e| DepotError::Config(format!("Failed to parse config: {:?}", e))) } }