Skip to content

getopts: format failure messages with Show #14884

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 14, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/compiletest/compiletest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ pub fn parse_config(args: Vec<String> ) -> 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") {
Expand Down
56 changes: 32 additions & 24 deletions src/libgetopts/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -94,12 +94,13 @@
#[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;

/// Name of an option. Either a string or a single char.
#[deriving(Clone, PartialEq)]
#[deriving(Clone, PartialEq, Eq)]
pub enum Name {
/// A string representing the long name of an option.
/// For example: "help"
Expand All @@ -110,7 +111,7 @@ pub enum Name {
}

/// Describes whether an option has an argument.
#[deriving(Clone, PartialEq)]
#[deriving(Clone, PartialEq, Eq)]
pub enum HasArg {
/// The option requires an argument.
Yes,
Expand All @@ -121,7 +122,7 @@ pub enum HasArg {
}

/// Describes how often an option may occur.
#[deriving(Clone, PartialEq)]
#[deriving(Clone, PartialEq, Eq)]
pub enum Occur {
/// The option occurs once.
Req,
Expand All @@ -132,7 +133,7 @@ pub enum Occur {
}

/// A description of a possible option.
#[deriving(Clone, PartialEq)]
#[deriving(Clone, PartialEq, Eq)]
pub struct Opt {
/// Name of the option
pub name: Name,
Expand All @@ -141,12 +142,12 @@ pub struct Opt {
/// How often it can occur
pub occur: Occur,
/// Which options it aliases
pub aliases: Vec<Opt> ,
pub aliases: Vec<Opt>,
}

/// One group of options, e.g., both -h and --help, along with
/// their shared description and properties.
#[deriving(Clone, PartialEq)]
#[deriving(Clone, PartialEq, Eq)]
pub struct OptGroup {
/// Short Name of the `OptGroup`
pub short_name: String,
Expand All @@ -163,28 +164,28 @@ pub struct OptGroup {
}

/// Describes whether an option is given at all or has a value.
#[deriving(Clone, PartialEq)]
#[deriving(Clone, PartialEq, Eq)]
enum Optval {
Val(String),
Given,
}

/// The result of checking command line arguments. Contains a vector
/// of matches and a vector of free strings.
#[deriving(Clone, PartialEq)]
#[deriving(Clone, PartialEq, Eq)]
pub struct Matches {
/// Options that matched
opts: Vec<Opt> ,
opts: Vec<Opt>,
/// Values of the Options that matched
vals: Vec<Vec<Optval> > ,
vals: Vec<Vec<Optval>>,
/// Free string fragments
pub free: Vec<String>,
}

/// 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, Eq)]
pub enum Fail_ {
/// The option requires an argument but none was passed.
ArgumentMissing(String),
Expand All @@ -199,7 +200,7 @@ pub enum Fail_ {
}

/// The type of failure that occurred.
#[deriving(PartialEq)]
#[deriving(PartialEq, Eq)]
#[allow(missing_doc)]
pub enum FailType {
ArgumentMissing_,
Expand Down Expand Up @@ -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)
}
}
}
Expand All @@ -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<Opt> = optgrps.iter().map(|x| x.long_to_short()).collect();
let n_opts = opts.len();
Expand Down Expand Up @@ -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!()
Expand Down
5 changes: 2 additions & 3 deletions src/librustc/driver/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion src/librustc/driver/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ pub fn handle_options(mut args: Vec<String>) -> Option<getopts::Matches> {
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());
}
};

Expand Down
2 changes: 1 addition & 1 deletion src/librustdoc/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
};
Expand Down
2 changes: 1 addition & 1 deletion src/libtest/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ pub fn parse_opts(args: &[String]) -> Option<OptRes> {
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; }
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/getopts_ref.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
};

}