use anyhow::Context; use serde::{Deserialize, Serialize}; use std::{collections::HashMap, fs::read_to_string, net::SocketAddr, path::PathBuf}; #[derive(Debug, Serialize, Deserialize)] pub struct Config { pub http: Option, pub https: Option, #[serde(default)] pub limits: Limits, #[serde(default)] pub hosts: HashMap, } #[derive(Debug, Serialize, Deserialize)] #[serde(default)] pub struct Limits { pub max_incoming_connections: usize, pub max_outgoing_connections: usize, } #[derive(Debug, Serialize, Deserialize)] pub struct HttpConfig { pub bind: SocketAddr, } #[derive(Debug, Serialize, Deserialize)] pub struct HttpsConfig { pub bind: SocketAddr, pub tls_cert: PathBuf, pub tls_key: PathBuf, } #[derive(Debug, Serialize, Deserialize)] #[serde(untagged)] pub enum HostConfig { Backend { backend: SocketAddr }, Files { files: FileserverConfig }, } #[derive(Debug, Serialize, Deserialize)] pub struct FileserverConfig { pub root: PathBuf, #[serde(default)] pub index: bool, } impl Config { pub fn load(path: &str) -> anyhow::Result { let raw = read_to_string(path).context("reading config file")?; let config: Config = toml::from_str(&raw).context("parsing config")?; Ok(config) } } impl Default for Limits { fn default() -> Self { Self { max_incoming_connections: 1024, max_outgoing_connections: usize::MAX, } } }