// False positive with itertools::process_results #![allow (clippy::redundant_closure)] use std::{ collections::HashMap, convert::{TryFrom}, iter::FromIterator, path::Path, }; use crate::{ errors::ConfigError, key_validity::*, }; // Stuff we need to load from the config file and use to // set up the HTTP server pub mod file { use serde::Deserialize; use crate::key_validity::*; #[derive (Deserialize)] pub struct Server { // This is duplicated in the hashmap, but it's not a problem pub name: String, pub tripcode: BlakeHashWrapper, pub display_name: Option , } #[derive (Deserialize)] pub struct DevMode { } // Stuff that's identical between the file and the runtime structures #[derive (Default, Deserialize)] pub struct Isomorphic { #[serde (default)] pub enable_scraper_api: bool, // If any of these fields are used, we are in dev mode and have to // show extra warnings, since some auth may be weakened pub dev_mode: Option , } #[derive (Deserialize)] pub struct Config { #[serde (flatten)] pub iso: Isomorphic, pub port: Option , pub servers: Vec , // Adding a DB will take a while, so I'm moving these out of dev mode. pub scraper_keys: Vec >, } } // Stuff we actually need at runtime pub struct Config { pub iso: file::Isomorphic, pub port: Option , pub servers: HashMap , pub scraper_keys: HashMap >, } impl TryFrom for Config { type Error = ConfigError; fn try_from (f: file::Config) -> Result { let servers = f.servers.into_iter () .map (|server| Ok::<_, ConfigError> ((server.name.clone (), server))); let servers = itertools::process_results (servers, |i| HashMap::from_iter (i))?; let scraper_keys = if f.iso.enable_scraper_api { HashMap::from_iter (f.scraper_keys.into_iter ().map (|key| (key.hash.encode_base64 (), key))) } else { Default::default () }; Ok (Self { iso: f.iso, port: f.port, servers, scraper_keys, }) } } impl Config { pub async fn from_file (path: &Path) -> Result { let config_s = tokio::fs::read_to_string (path).await?; let new_config: file::Config = toml::from_str (&config_s)?; Self::try_from (new_config) } }