// Copyright 2018 The Grin Developers // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //! Public types for config modules use std::fmt; use std::io; use std::path::PathBuf; use servers::{ServerConfig, StratumServerConfig}; use util::LoggingConfig; use wallet::WalletConfig; /// Error type wrapping config errors. #[derive(Debug)] pub enum ConfigError { /// Error with parsing of config file ParseError(String, String), /// Error with fileIO while reading config file FileIOError(String, String), /// No file found FileNotFoundError(String), /// Error serializing config values SerializationError(String), } impl fmt::Display for ConfigError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { ConfigError::ParseError(ref file_name, ref message) => write!( f, "Error parsing configuration file at {} - {}", file_name, message ), ConfigError::FileIOError(ref file_name, ref message) => { write!(f, "{} {}", message, file_name) } ConfigError::FileNotFoundError(ref file_name) => { write!(f, "Configuration file not found: {}", file_name) } ConfigError::SerializationError(ref message) => { write!(f, "Error serializing configuration: {}", message) } } } } impl From for ConfigError { fn from(error: io::Error) -> ConfigError { ConfigError::FileIOError( String::from(""), String::from(format!("Error loading config file: {}", error)), ) } } /// Going to hold all of the various configuration types /// separately for now, then put them together as a single /// ServerConfig object afterwards. This is to flatten /// out the configuration file into logical sections, /// as they tend to be quite nested in the code /// Most structs optional, as they may or may not /// be needed depending on what's being run #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct GlobalConfig { /// Keep track of the file we've read pub config_file_path: Option, /// Global member config pub members: Option, } /// Keeping an 'inner' structure here, as the top /// level GlobalConfigContainer options might want to keep /// internal state that we don't necessarily /// want serialised or deserialised #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct ConfigMembers { /// Server config #[serde(default)] pub server: ServerConfig, /// Mining config pub mining_server: Option, /// Logging config pub logging: Option, /// Wallet config. May eventually need to be moved to its own thing. Or not. /// Depends on whether we end up starting the wallet in its own process but /// with the same lifecycle as the server. #[serde(default)] pub wallet: WalletConfig, }