From 0642cbbde0e51d5f4465b937ab8ff7d46df02df0 Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Sat, 14 Jun 2014 11:11:09 +1000 Subject: [PATCH] getopts: format failure messages with `Show`. This obsoletes the old `to_err_msg` method. Replace println!("Error: {}", failure.to_err_msg()) let string = failure.to_err_msg(); with println!("Error: {}", failure) let string = failure.to_str(); [breaking-change] --- src/compiletest/compiletest.rs | 2 +- src/libgetopts/lib.rs | 34 ++++++++++++++++++++------------ src/librustc/driver/config.rs | 5 ++--- src/librustc/driver/mod.rs | 2 +- src/librustdoc/lib.rs | 2 +- src/libtest/lib.rs | 2 +- src/test/run-pass/getopts_ref.rs | 2 +- 7 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/compiletest/compiletest.rs b/src/compiletest/compiletest.rs index 977b7dc32c5..1d7f36d0fe0 100644 --- a/src/compiletest/compiletest.rs +++ b/src/compiletest/compiletest.rs @@ -110,7 +110,7 @@ pub fn parse_config(args: Vec ) -> Config { let matches = &match getopts::getopts(args_.as_slice(), groups.as_slice()) { Ok(m) => m, - Err(f) => fail!("{}", f.to_err_msg()) + Err(f) => fail!("{}", f) }; if matches.opt_present("h") || matches.opt_present("help") { diff --git a/src/libgetopts/lib.rs b/src/libgetopts/lib.rs index db6d940a720..7374ea5c366 100644 --- a/src/libgetopts/lib.rs +++ b/src/libgetopts/lib.rs @@ -61,7 +61,7 @@ //! ]; //! let matches = match getopts(args.tail(), opts) { //! Ok(m) => { m } -//! Err(f) => { fail!(f.to_err_msg()) } +//! Err(f) => { fail!(f.to_str()) } //! }; //! if matches.opt_present("h") { //! print_usage(program.as_slice(), opts); @@ -94,6 +94,7 @@ #[cfg(test, not(stage0))] #[phase(plugin, link)] extern crate log; use std::cmp::PartialEq; +use std::fmt; use std::result::{Err, Ok}; use std::result; use std::string::String; @@ -182,9 +183,9 @@ pub struct Matches { } /// The type returned when the command line does not conform to the -/// expected format. Call the `to_err_msg` method to retrieve the -/// error as a string. -#[deriving(Clone, PartialEq, Show)] +/// expected format. Use the `Show` implementation to output detailed +/// information. +#[deriving(Clone, PartialEq)] pub enum Fail_ { /// The option requires an argument but none was passed. ArgumentMissing(String), @@ -498,22 +499,29 @@ pub fn opt(short_name: &str, impl Fail_ { /// Convert a `Fail_` enum into an error string. + #[deprecated="use `Show` (`{}` format specifier)"] pub fn to_err_msg(self) -> String { - match self { + self.to_str() + } +} + +impl fmt::Show for Fail_ { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { ArgumentMissing(ref nm) => { - format!("Argument to option '{}' missing.", *nm) + write!(f, "Argument to option '{}' missing.", *nm) } UnrecognizedOption(ref nm) => { - format!("Unrecognized option: '{}'.", *nm) + write!(f, "Unrecognized option: '{}'.", *nm) } OptionMissing(ref nm) => { - format!("Required option '{}' missing.", *nm) + write!(f, "Required option '{}' missing.", *nm) } OptionDuplicated(ref nm) => { - format!("Option '{}' given more than once.", *nm) + write!(f, "Option '{}' given more than once.", *nm) } UnexpectedArgument(ref nm) => { - format!("Option '{}' does not take an argument.", *nm) + write!(f, "Option '{}' does not take an argument.", *nm) } } } @@ -522,8 +530,9 @@ impl Fail_ { /// Parse command line arguments according to the provided options. /// /// On success returns `Ok(Opt)`. Use methods such as `opt_present` -/// `opt_str`, etc. to interrogate results. Returns `Err(Fail_)` on failure. -/// Use `to_err_msg` to get an error message. +/// `opt_str`, etc. to interrogate results. Returns `Err(Fail_)` on +/// failure: use the `Show` implementation of `Fail_` to display +/// information about it. pub fn getopts(args: &[String], optgrps: &[OptGroup]) -> Result { let opts: Vec = optgrps.iter().map(|x| x.long_to_short()).collect(); let n_opts = opts.len(); @@ -1110,7 +1119,6 @@ mod tests { let rs = getopts(args.as_slice(), opts.as_slice()); match rs { Err(f) => { - error!("{:?}", f.clone().to_err_msg()); check_fail_type(f, UnexpectedArgument_); } _ => fail!() diff --git a/src/librustc/driver/config.rs b/src/librustc/driver/config.rs index 3326b4e8304..b8838890bcf 100644 --- a/src/librustc/driver/config.rs +++ b/src/librustc/driver/config.rs @@ -792,7 +792,7 @@ mod test { let matches = &match getopts(["--test".to_string()], optgroups().as_slice()) { Ok(m) => m, - Err(f) => fail!("test_switch_implies_cfg_test: {}", f.to_err_msg()) + Err(f) => fail!("test_switch_implies_cfg_test: {}", f) }; let sessopts = build_session_options(matches); let sess = build_session(sessopts, None); @@ -809,8 +809,7 @@ mod test { optgroups().as_slice()) { Ok(m) => m, Err(f) => { - fail!("test_switch_implies_cfg_test_unless_cfg_test: {}", - f.to_err_msg()); + fail!("test_switch_implies_cfg_test_unless_cfg_test: {}", f) } }; let sessopts = build_session_options(matches); diff --git a/src/librustc/driver/mod.rs b/src/librustc/driver/mod.rs index b6205d8d54e..ff7f59559ca 100644 --- a/src/librustc/driver/mod.rs +++ b/src/librustc/driver/mod.rs @@ -205,7 +205,7 @@ pub fn handle_options(mut args: Vec) -> Option { match getopts::getopts(args.as_slice(), config::optgroups().as_slice()) { Ok(m) => m, Err(f) => { - early_error(f.to_err_msg().as_slice()); + early_error(f.to_str().as_slice()); } }; diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index 1e4af1db8a9..f135e30c4eb 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -148,7 +148,7 @@ pub fn main_args(args: &[String]) -> int { let matches = match getopts::getopts(args.tail(), opts().as_slice()) { Ok(m) => m, Err(err) => { - println!("{}", err.to_err_msg()); + println!("{}", err); return 1; } }; diff --git a/src/libtest/lib.rs b/src/libtest/lib.rs index d0101e993c4..9108a2c9459 100644 --- a/src/libtest/lib.rs +++ b/src/libtest/lib.rs @@ -367,7 +367,7 @@ pub fn parse_opts(args: &[String]) -> Option { let matches = match getopts::getopts(args_.as_slice(), optgroups().as_slice()) { Ok(m) => m, - Err(f) => return Some(Err(f.to_err_msg().to_string())) + Err(f) => return Some(Err(f.to_str())) }; if matches.opt_present("h") { usage(args[0].as_slice()); return None; } diff --git a/src/test/run-pass/getopts_ref.rs b/src/test/run-pass/getopts_ref.rs index 8fc84cece5a..98a7b67e0dc 100644 --- a/src/test/run-pass/getopts_ref.rs +++ b/src/test/run-pass/getopts_ref.rs @@ -20,7 +20,7 @@ pub fn main() { match getopts(args.as_slice(), opts.as_slice()) { Ok(ref m) => assert!(!m.opt_present("b")), - Err(ref f) => fail!("{:?}", (*f).clone().to_err_msg()) + Err(ref f) => fail!("{}", *f) }; }