From c97c59f62f25ec3f9467c296ade81298703d4cd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 29 Nov 2016 13:23:28 +0100 Subject: [PATCH] returning errors with extra fields in config file (#3663) --- parity/cli/config.invalid3.toml | 3 +++ parity/cli/mod.rs | 9 +++++---- parity/cli/usage.rs | 17 +++++++++++++---- 3 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 parity/cli/config.invalid3.toml diff --git a/parity/cli/config.invalid3.toml b/parity/cli/config.invalid3.toml new file mode 100644 index 000000000..a43afe03d --- /dev/null +++ b/parity/cli/config.invalid3.toml @@ -0,0 +1,3 @@ +[signer] +passwd = [] + diff --git a/parity/cli/mod.rs b/parity/cli/mod.rs index 93373c383..3f67cf1fa 100644 --- a/parity/cli/mod.rs +++ b/parity/cli/mod.rs @@ -649,11 +649,12 @@ mod tests { fn should_parse_config_and_return_errors() { let config1 = Args::parse_config(include_str!("./config.invalid1.toml")); let config2 = Args::parse_config(include_str!("./config.invalid2.toml")); + let config3 = Args::parse_config(include_str!("./config.invalid3.toml")); - match (config1, config2) { - (Err(ArgsError::Parsing(_)), Err(ArgsError::Decode(_))) => {}, - (a, b) => { - assert!(false, "Got invalid error types: {:?}, {:?}", a, b); + match (config1, config2, config3) { + (Err(ArgsError::Parsing(_)), Err(ArgsError::Decode(_)), Err(ArgsError::UnknownFields(_))) => {}, + (a, b, c) => { + assert!(false, "Got invalid error types: {:?}, {:?}, {:?}", a, b, c); } } } diff --git a/parity/cli/usage.rs b/parity/cli/usage.rs index a38c28876..6dcbd6453 100644 --- a/parity/cli/usage.rs +++ b/parity/cli/usage.rs @@ -58,6 +58,7 @@ macro_rules! usage { Parsing(Vec), Decode(toml::DecodeError), Config(String, io::Error), + UnknownFields(String), } impl ArgsError { @@ -80,6 +81,11 @@ macro_rules! usage { println_stderr!("There was an error reading your config file at: {}", path); println_stderr!("{}", e); process::exit(2) + }, + ArgsError::UnknownFields(fields) => { + println_stderr!("You have some extra fields in your config file:"); + println_stderr!("{}", fields); + process::exit(2) } } } @@ -173,10 +179,13 @@ macro_rules! usage { let mut value_parser = toml::Parser::new(&config); match value_parser.parse() { Some(value) => { - let result = rustc_serialize::Decodable::decode(&mut toml::Decoder::new(toml::Value::Table(value))); - match result { - Ok(config) => Ok(config), - Err(e) => Err(e.into()), + let mut decoder = toml::Decoder::new(toml::Value::Table(value)); + let result = rustc_serialize::Decodable::decode(&mut decoder); + + match (result, decoder.toml) { + (Err(e), _) => Err(e.into()), + (_, Some(toml)) => Err(ArgsError::UnknownFields(toml::encode_str(&toml))), + (Ok(config), None) => Ok(config), } }, None => Err(ArgsError::Parsing(value_parser.errors)),