use std::collections::HashMap; use std::fs::File; use std::io::{BufReader, BufWriter}; use std::path::PathBuf; use serenity::model::prelude::*; use crate::error::ManifoldResult; #[derive(Debug)] pub struct ManifoldConfig { config_path: PathBuf, config_environment: String, config: HashMap } pub trait Config { fn load_config(&mut self) -> ManifoldResult; fn save_config(&self) -> ManifoldResult; fn create_default_config(&self, config_file: &String, config_environment: &String) -> ManifoldResult; fn get_environment(&self) -> &String; fn get_path(&self) -> &PathBuf; fn get_environment_mut(&mut self) -> &mut String; fn get_path_mut(&mut self) -> &mut PathBuf; fn get_value(&self, key: &String) -> Option<&String>; fn set_value(&mut self, key: &String, value: &String) -> Option; fn unset_value(&mut self, key: &String) -> Option; fn get_role(&self, role_name: &String) -> RoleId; fn get_channel(&self, channel_name: &String) -> ChannelId; fn get_message(&self, message_id: &String) -> MessageId; } impl ManifoldConfig { pub fn new() -> Self { ManifoldConfig { config_path: Default::default(), config_environment: "Production".to_string(), config: HashMap::::new(), } } } impl Config for ManifoldConfig { fn load_config(&mut self) -> ManifoldResult { let file = File::open(&self.config_path).expect("Could not open config file. Please check and retry."); let reader = BufReader::new(file); self.config = serde_json::from_reader(reader) .map_err(|e| {error!("Error reading config as JSON: {:?}", e.to_string()); e} )?; let config_entry_count = self.config.len(); debug!("Loaded config: {:?}", &self.config); debug!("Loaded {} entries", config_entry_count); Ok(config_entry_count) } fn save_config(&self) -> ManifoldResult { let file = File::create(&self.config_path).expect("Could not open config file for saving."); let writer = BufWriter::new(file); serde_json::to_writer(writer, &self.config)?; let config_entry_count = self.config.len(); Ok(config_entry_count) } fn create_default_config(&self, config_file: &String, config_environment: &String) -> ManifoldResult { let mut config = ManifoldConfig::new(); config.config_environment = config_environment.to_owned(); config.config_path = PathBuf::from(config_file); config.config.insert(format!("{}LogChannel", config_environment), "".to_string()); config.config.insert(format!("{}BotOwner", config_environment), "".to_string()); config.config.insert(format!("{}AdminRole", config_environment), "".to_string()); config.config.insert(format!("{}DJRole", config_environment), "".to_string()); config.config.insert(format!("{}SpamChannel", config_environment), "true".to_string()); config.config.insert(format!("{}ResponsesFilePath", config_environment), "config/responses.txt".to_string()); config.save_config() } fn get_environment(&self) -> &String { &self.config_environment } fn get_path(&self) -> &PathBuf { &self.config_path } fn get_environment_mut(&mut self) -> &mut String { &mut self.config_environment } fn get_path_mut(&mut self) -> &mut PathBuf { &mut self.config_path } fn get_value(&self, key: &String) -> Option<&String> { self.config.get(&format!("{}{}", &self.config_environment, key)) } fn set_value(&mut self, key: &String, value: &String) -> Option { self.config.insert(format!("{}{}", &self.config_environment, key), value.clone()) } fn unset_value(&mut self, key: &String) -> Option { self.config.remove(&*format!("{}{}", &self.config_environment, key)) } fn get_role(&self, role_name: &String) -> RoleId { let key = format!("{}Role", role_name); RoleId(self.get_value(&key).unwrap().parse::().unwrap()) } fn get_channel(&self, channel_name: &String) -> ChannelId { let key = format!("{}Channel", channel_name); ChannelId(self.get_value(&key).unwrap().parse::().unwrap()) } fn get_message(&self, message_id: &String) -> MessageId { let key = format!("{}Message", message_id); MessageId(self.get_value(&key).unwrap().parse::().unwrap()) } }