diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..5dd2761 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,70 @@ +/* Copyright 2021 Daniel Mowitz + * This file is part of Mention2Mail. + * + * Mention2Mail is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Mention2Mail is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Mention2Mail. If not, see . + */ + +use std::{ + path::Path, + io::Read, + fs::read_dir, +}; +use toml::value::Value; + +/// parses a toml config file and sets some default values +/// if the corresponding fields are not set. +// TODO: Document config file options once they are stable. +pub fn get_main_config(config_path: &Path) + -> Result> { + + // I once read that this multiple let style + // is the "rusty" way to do things. + // Personally, I find this specific instance to be somewhat sketchy. + let mut config = String::new(); + std::fs::File::open(config_path)? + .read_to_string(&mut config)?; + let mut config = config.parse::()?; + // The important thing here is that config is a mut Table in the end. + let mut config = config.as_table_mut().unwrap().clone(); + + if config.get("port") == None { + config.insert(String::from("port"), Value::from("6697")); + } + + if config.get("tls") == None { + if config["port"].as_integer() == Some(194) || + config["port"].as_integer() == Some(6667) { + config.insert(String::from("tls"), Value::from(false)); + }else if config["port"].as_integer() == Some(6696) || + config["port"].as_integer() == Some(6697) { + config.insert(String::from("tls"), Value::from(true)); + } + } + + Ok(Value::from(config)) +} + +pub fn get_server_config (config: Value, config_path: &Path) + -> Result> { + if config_path.is_dir() { + for entry in read_dir(config_path)? { + let entry = entry?; + let server_path = entry.path(); + if server_path.is_dir(){ + config = server_config_helper(config, server_path)?; + } + } + } + Ok(config) +} diff --git a/src/main.rs b/src/main.rs index 988c2df..a402bc2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,12 +16,12 @@ */ pub mod connect; +pub mod config; use std::{ format, env::args, path::Path, - io::Read, collections::VecDeque, }; use irc_proto::command::{ @@ -38,39 +38,6 @@ use toml::value::Value; trait IrcReadWrite: IrcRead + IrcWrite {} impl IrcReadWrite for T {} -/// parses a toml config file and sets some default values -/// if the corresponding fields are not set. -// TODO: Document config file options once they are stable. -fn get_config>(config_path: P) - -> Result> { - - // I once read that this multiple let style - // is the "rusty" way to do things. - // Personally, I find this specific instance to be somewhat sketchy. - let mut config = String::new(); - std::fs::File::open(config_path)? - .read_to_string(&mut config)?; - let mut config = config.parse::()?; - // The important thing here is that config is a mut Table in the end. - let mut config = config.as_table_mut().unwrap().clone(); - - if config.get("port") == None { - config.insert(String::from("port"), Value::from("6697")); - } - - if config.get("tls") == None { - if config["port"].as_integer() == Some(194) || - config["port"].as_integer() == Some(6667) { - config.insert(String::from("tls"), Value::from(false)); - }else if config["port"].as_integer() == Some(6696) || - config["port"].as_integer() == Some(6697) { - config.insert(String::from("tls"), Value::from(true)); - } - } - - Ok(Value::from(config)) -} - /// Constructs a VecDeque with the messages /// required to identify with an IRC server. /// Uses the credentials set in -`config.toml`. @@ -188,14 +155,14 @@ fn main() { let mut config; match config_path { - Some(p) => config = get_config(p) + Some(p) => config = config::get_main_config(&Path::from(p)) .expect("Could not get config"), - None => config = get_config("/etc/Mention2Mail/config.toml") + None => config = config::get_main_config(&Path::from("/etc/Mention2Mail/config.toml")) .expect("Could not get default config in /etc/Mention2Mail/default.toml"), } match server_conf_path { - Some(p) => config = get_server_config(config, p) + Some(p) => config = config::get_server_config(config, p) .expect("Could not get server config."), None => (), }