use std::env; use async_std::{fs, path::PathBuf}; #[derive(Clone)] pub struct Config { pub files_dir: PathBuf, pub max_file_size: Option, pub no_auth_limits: Option, } #[derive(Clone)] pub struct NoAuthLimits { pub auth_password: String, pub max_time: u64, pub large_file_max_time: u64, pub large_file_size: u64, } pub async fn get_config() -> Config { let max_file_size = env::var("UPLOAD_MAX_BYTES") .ok() .and_then(|variable| variable.parse().ok()) .unwrap_or(8 * 1024 * 1024); let max_file_size = (max_file_size != 0).then(|| max_file_size); let files_dir = PathBuf::from(env::var("FILES_DIR").unwrap_or_else(|_| "./files".to_owned())); fs::create_dir_all(&files_dir) .await .expect("could not create directory for storing files"); let no_auth_limits = match ( env::var("AUTH_PASSWORD").ok(), env_number("NO_AUTH_MAX_TIME"), env_number("NO_AUTH_LARGE_FILE_MAX_TIME"), env_number("NO_AUTH_LARGE_FILE_SIZE"), ) { (Some(auth_password), Some(max_time), Some(large_file_max_time), Some(large_file_size)) => { Some(NoAuthLimits { auth_password, max_time, large_file_max_time, large_file_size, }) } _ => None, }; Config { files_dir, max_file_size, no_auth_limits, } } fn env_number(variable: &str) -> Option { env::var(variable).ok().and_then(|n| n.parse::().ok()) }