2015-09-05 21:17:32 +00:00
|
|
|
use std::error::Error;
|
|
|
|
use std::fmt;
|
|
|
|
|
|
|
|
/// Command line argument parser error types
|
|
|
|
#[derive(PartialEq, Debug)]
|
2015-09-04 21:32:11 +00:00
|
|
|
pub enum ClapErrorType {
|
2015-09-05 21:17:32 +00:00
|
|
|
/// Error occurs when some possible values were set, but clap found unexpected value
|
|
|
|
///
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```no_run
|
|
|
|
/// # use clap::{App, Arg};
|
|
|
|
/// # let result = App::new("myprog")
|
|
|
|
/// # .arg(
|
|
|
|
/// # Arg::with_name("debug").index(1)
|
|
|
|
/// .possible_value("fast")
|
|
|
|
/// .possible_value("slow")
|
|
|
|
/// # ).get_matches_from_safe(vec!["", "other"]);
|
2015-09-05 22:12:46 +00:00
|
|
|
/// ```
|
2015-09-05 21:17:32 +00:00
|
|
|
InvalidValue,
|
|
|
|
/// Error occurs when clap found unexpected flag or option
|
|
|
|
///
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```no_run
|
|
|
|
/// # use clap::{App, Arg};
|
|
|
|
/// # let result = App::new("myprog")
|
|
|
|
/// # .arg(
|
|
|
|
/// # Arg::from_usage("-f, --flag 'some flag'")
|
|
|
|
/// # ).get_matches_from_safe(vec!["", "--other"]);
|
2015-09-05 22:12:46 +00:00
|
|
|
/// ```
|
2015-09-05 21:17:32 +00:00
|
|
|
InvalidArgument,
|
|
|
|
/// Error occurs when clap found unexpected subcommand
|
|
|
|
///
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```no_run
|
|
|
|
/// # use clap::{App, Arg, SubCommand};
|
|
|
|
/// # let result = App::new("myprog")
|
|
|
|
/// # .subcommand(
|
|
|
|
/// SubCommand::with_name("conifg")
|
|
|
|
/// .about("Used for configuration")
|
|
|
|
/// .arg(Arg::with_name("config_file")
|
|
|
|
/// .help("The configuration file to use")
|
|
|
|
/// .index(1))
|
|
|
|
/// # ).get_matches_from_safe(vec!["", "other"]);
|
2015-09-05 22:12:46 +00:00
|
|
|
/// ```
|
2015-09-05 21:17:32 +00:00
|
|
|
InvalidSubcommand,
|
|
|
|
/// Error occurs when option does not allow empty values but some was found
|
|
|
|
///
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```no_run
|
|
|
|
/// # use clap::{App, Arg};
|
|
|
|
/// # let result = App::new("myprog")
|
|
|
|
/// # .arg(
|
|
|
|
/// # Arg::with_name("debug")
|
|
|
|
/// .empty_values(false))
|
|
|
|
/// # .arg(
|
|
|
|
/// # Arg::with_name("color")
|
|
|
|
/// # ).get_matches_from_safe(vec!["", "--debug", "--color"]);
|
2015-09-05 22:12:46 +00:00
|
|
|
/// ```
|
2015-09-05 21:17:32 +00:00
|
|
|
EmptyValue,
|
|
|
|
/// Parser inner error
|
|
|
|
OptionError,
|
|
|
|
/// Parser inner error
|
|
|
|
ArgumentError,
|
|
|
|
/// Parser inner error
|
|
|
|
ValueError,
|
|
|
|
/// Error occurs when argument got more values then were expected
|
|
|
|
///
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```no_run
|
|
|
|
/// # use clap::{App, Arg};
|
|
|
|
/// # let result = App::new("myprog")
|
|
|
|
/// # .arg(
|
|
|
|
/// # Arg::with_name("debug").index(1)
|
|
|
|
/// .max_values(2)
|
|
|
|
/// # ).get_matches_from_safe(vec!["", "too", "much", "values"]);
|
2015-09-05 22:12:46 +00:00
|
|
|
/// ```
|
2015-09-05 21:17:32 +00:00
|
|
|
TooMuchValues,
|
|
|
|
/// Error occurs when argument got less values then were expected
|
|
|
|
///
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```no_run
|
|
|
|
/// # use clap::{App, Arg};
|
|
|
|
/// # let result = App::new("myprog")
|
|
|
|
/// # .arg(
|
|
|
|
/// # Arg::with_name("debug").index(1)
|
|
|
|
/// .min_values(3)
|
|
|
|
/// # ).get_matches_from_safe(vec!["", "too", "few"]);
|
2015-09-05 22:12:46 +00:00
|
|
|
/// ```
|
2015-09-05 21:17:32 +00:00
|
|
|
TooFewValues,
|
|
|
|
/// Error occurs when clap find two ore more conflicting arguments
|
|
|
|
///
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```no_run
|
|
|
|
/// # use clap::{App, Arg};
|
|
|
|
/// # let result = App::new("myprog")
|
|
|
|
/// # .arg(
|
|
|
|
/// # Arg::with_name("debug")
|
|
|
|
/// .conflicts_with("color")
|
|
|
|
/// # ).get_matches_from_safe(vec!["", "--debug", "--color"]);
|
2015-09-05 22:12:46 +00:00
|
|
|
/// ```
|
2015-09-05 21:17:32 +00:00
|
|
|
ArgumentConflict,
|
|
|
|
/// Error occurs when one or more required arguments missing
|
|
|
|
///
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```no_run
|
|
|
|
/// # use clap::{App, Arg};
|
|
|
|
/// # let result = App::new("myprog")
|
|
|
|
/// # .arg(
|
|
|
|
/// # Arg::with_name("debug")
|
|
|
|
/// .required(true)
|
|
|
|
/// # ).get_matches_from_safe(vec![""]);
|
2015-09-05 22:12:46 +00:00
|
|
|
/// ```
|
2015-09-05 21:17:32 +00:00
|
|
|
MissingRequiredArgument,
|
|
|
|
/// Error occurs when required subcommand missing
|
|
|
|
///
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```no_run
|
|
|
|
/// # use clap::{App, Arg, AppSettings, SubCommand};
|
|
|
|
/// # let result = App::new("myprog")
|
|
|
|
/// # .setting(AppSettings::SubcommandRequired)
|
|
|
|
/// # .subcommand(
|
|
|
|
/// SubCommand::with_name("conifg")
|
|
|
|
/// .about("Used for configuration")
|
|
|
|
/// .arg(Arg::with_name("config_file")
|
|
|
|
/// .help("The configuration file to use")
|
|
|
|
/// .index(1))
|
|
|
|
/// # ).get_matches_from_safe(vec![""]);
|
2015-09-05 22:12:46 +00:00
|
|
|
/// ```
|
2015-09-05 21:17:32 +00:00
|
|
|
MissingSubcommand,
|
|
|
|
/// Error occurs when clap find argument while is was not expecting any
|
|
|
|
///
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```no_run
|
|
|
|
/// # use clap::{App};
|
|
|
|
/// # let result = App::new("myprog").get_matches_from_safe(vec!["", "--arg"]);
|
2015-09-05 22:12:46 +00:00
|
|
|
/// ```
|
2015-09-05 21:17:32 +00:00
|
|
|
UnexpectedArgument,
|
|
|
|
/// Error occurs when argument was used multiple times and was not set as multiple.
|
|
|
|
///
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```no_run
|
|
|
|
/// # use clap::{App, Arg};
|
|
|
|
/// # let result = App::new("myprog")
|
|
|
|
/// # .arg(
|
|
|
|
/// # Arg::with_name("debug")
|
|
|
|
/// .multiple(false)
|
|
|
|
/// # ).get_matches_from_safe(vec!["", "--debug", "--debug"]);
|
2015-09-05 22:12:46 +00:00
|
|
|
/// ```
|
2015-09-05 21:17:32 +00:00
|
|
|
UnexpectedMultipleUsage
|
2015-09-04 21:32:11 +00:00
|
|
|
}
|
|
|
|
|
2015-09-05 21:17:32 +00:00
|
|
|
/// Command line argument parser error
|
|
|
|
#[derive(Debug)]
|
2015-09-04 21:32:11 +00:00
|
|
|
pub struct ClapError {
|
2015-09-05 21:17:32 +00:00
|
|
|
/// Formated error message
|
|
|
|
pub error: String,
|
|
|
|
/// Command line argument parser error type
|
|
|
|
pub error_type: ClapErrorType
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Error for ClapError {
|
|
|
|
fn description(&self) -> &str {
|
|
|
|
&*self.error
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl fmt::Display for ClapError {
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
|
|
write!(f, "{}", self.error)
|
|
|
|
}
|
2015-09-03 21:51:37 +00:00
|
|
|
}
|