use crate::result::Result; use anyhow::{anyhow, Context}; use std::{env::var, net::SocketAddr, path::PathBuf}; #[derive(Debug, Clone)] pub struct Config { pub bind_addr: SocketAddr, pub db_path: PathBuf, pub img_path: PathBuf, } impl Config { pub fn from_env() -> Result { let config = Self { bind_addr: var("GL_BIND_ADDR") .with_context(|| "Bind address missing.")? .parse() .with_context(|| "Failed to parse bind address.")?, db_path: var("GL_DB_PATH") .with_context(|| "Database path missing.")? .parse() .with_context(|| "Failed to parse database path.")?, img_path: var("GL_IMG_PATH") .with_context(|| "Image store path missing.")? .parse() .with_context(|| "Failed to parse image store path.")?, }; if config.db_path.is_dir() { Err(anyhow!(format!( "Database path {:?} is not a regular file", config.db_path ))) } else if !config.img_path.is_dir() { Err(anyhow!(format!( "Image store path {:?} is not a directory.", config.img_path ))) } else if config.img_path.read_dir().is_err() { Err(anyhow!(format!( "Image store path {:?} is not readable.", config.img_path ))) } else { Ok(config) } } }