1//! Configuration loading from environment variables. 2 3use anyhow::anyhow; 4use std::env; 5 6/// Service configuration loaded from environment. 7pub struct Config { 8 pub host: String, 9 pub port: u16, 10 pub auth_token: Option<String>, 11 pub audd_api_token: String, 12 pub audd_api_url: String, 13 pub database_url: Option<String>, 14 pub labeler_did: Option<String>, 15 pub labeler_signing_key: Option<String>, 16} 17 18impl Config { 19 /// Load configuration from environment variables. 20 pub fn from_env() -> anyhow::Result<Self> { 21 Ok(Self { 22 host: env::var("MODERATION_HOST").unwrap_or_else(|_| "0.0.0.0".to_string()), 23 port: env::var("MODERATION_PORT") 24 .ok() 25 .and_then(|v| v.parse().ok()) 26 .unwrap_or(8083), 27 auth_token: env::var("MODERATION_AUTH_TOKEN").ok(), 28 audd_api_token: env::var("MODERATION_AUDD_API_TOKEN") 29 .map_err(|_| anyhow!("MODERATION_AUDD_API_TOKEN is required"))?, 30 audd_api_url: env::var("MODERATION_AUDD_API_URL") 31 .unwrap_or_else(|_| "https://enterprise.audd.io/".to_string()), 32 database_url: env::var("MODERATION_DATABASE_URL").ok(), 33 labeler_did: env::var("MODERATION_LABELER_DID").ok(), 34 labeler_signing_key: env::var("MODERATION_LABELER_SIGNING_KEY").ok(), 35 }) 36 } 37 38 /// Check if labeler is fully configured. 39 pub fn labeler_enabled(&self) -> bool { 40 self.database_url.is_some() 41 && self.labeler_did.is_some() 42 && self.labeler_signing_key.is_some() 43 } 44}