diff --git a/src/lib/config.rs b/src/lib/config.rs index 6521b5c..708ebf2 100644 --- a/src/lib/config.rs +++ b/src/lib/config.rs @@ -52,6 +52,14 @@ pub enum ProgramStartError { ConfigCliError(ConfigError), InvalidArgs(Error), FromFile(FromFileError), + PresetOptions { + name: String, + error: String + }, + PresetNotSupported { + name: String, + }, + Presets(Vec), Ip, BindHttp(std::io::Error), BindHttps(std::io::Error), @@ -93,6 +101,24 @@ impl std::fmt::Display for ProgramStartError { ProgramStartError::Ip => { write!(f, "could not retrieve the address for the config-server") } + ProgramStartError::PresetOptions { + name, + error + } => { + write!(f, "preset {} could not be parsed\nerror: {}", name, error) + } + ProgramStartError::PresetNotSupported { + name, + } => { + write!(f, "preset {} is not currently supported", name) + } + ProgramStartError::Presets(errors) => { + let res = errors.iter() + .map(|x| x.to_string()) + .collect::>() + .join("\n"); + write!(f, "{}", res) + } } } } diff --git a/src/lib/setup.rs b/src/lib/setup.rs index fb54b13..05a82de 100644 --- a/src/lib/setup.rs +++ b/src/lib/setup.rs @@ -13,6 +13,7 @@ use serde_json; use std::collections::HashMap; use std::sync::Arc; use std::sync::Mutex; +use config::ProgramStartError; pub type PresetsMap = HashMap>>; @@ -36,6 +37,41 @@ pub fn apply_presets( app.default_resource(|r| r.f(proxy_transform)) } +pub fn validate_presets(presets: Vec<&str>, program_config: &ProgramConfig) -> Result<(), ProgramStartError> { + let mut errors = vec![]; + program_config.presets.iter().enumerate().for_each(|(i, preset)| { + match preset.name.as_str() { + "m2" => { + let preset_opts: Result + = serde_json::from_value(preset.options.clone()); + + match preset_opts { + Err(e) => { + errors.push(ProgramStartError::PresetOptions { + error: e.to_string(), + name: "m2".to_string() + }) + }, + _ => {} + } + } + _ => { + errors.push( + ProgramStartError::PresetNotSupported { + name: "m2".to_string() + } + ); + }, + } + }); + + if errors.len() > 0 { + Err(ProgramStartError::Presets(errors)) + } else { + Ok(()) + } +} + pub fn state_and_presets( opts: &ProgramOptions, program_config: &ProgramConfig, diff --git a/src/lib/system.rs b/src/lib/system.rs index 6d80d78..e6994ec 100644 --- a/src/lib/system.rs +++ b/src/lib/system.rs @@ -9,6 +9,7 @@ use setup::state_and_presets; use ssl; use std::net::SocketAddr; use std::net::SocketAddrV4; +use setup::validate_presets; pub fn create(opts: ProgramOptions) -> Result<(actix::SystemRunner, String), ProgramStartError> { // @@ -41,6 +42,11 @@ pub fn create(opts: ProgramOptions) -> Result<(actix::SystemRunner, String), Pro // let maybe_seed = server_opts.seed_file.clone(); + // + // Exit early if any presets fail validation + // + let _validated_presets = validate_presets(vec!["m2"], &program_config)?; + // // Now start the server //