mirror of
https://github.com/Noratrieb/badargs.git
synced 2026-01-16 04:35:06 +01:00
error reporting
This commit is contained in:
parent
d2788c133c
commit
34bddb59a6
4 changed files with 52 additions and 12 deletions
|
|
@ -7,7 +7,11 @@ arg!(OLevel: "optimize" -> usize);
|
||||||
fn main() {
|
fn main() {
|
||||||
let args = badargs::badargs!(OutFile, Force, OLevel);
|
let args = badargs::badargs!(OutFile, Force, OLevel);
|
||||||
|
|
||||||
let _outfile = args.get::<OutFile>();
|
let outfile = args.get::<OutFile>();
|
||||||
let _force = args.get::<Force>();
|
let force = args.get::<Force>();
|
||||||
let _o_level = args.get::<OLevel>();
|
let o_level = args.get::<OLevel>();
|
||||||
|
|
||||||
|
println!("output: {:?}", outfile);
|
||||||
|
println!("force: {:?}", force);
|
||||||
|
println!("o-level: {:?}", o_level);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
19
src/lib.rs
19
src/lib.rs
|
|
@ -32,6 +32,7 @@
|
||||||
|
|
||||||
mod macros;
|
mod macros;
|
||||||
mod parse;
|
mod parse;
|
||||||
|
mod reporting;
|
||||||
mod schema;
|
mod schema;
|
||||||
|
|
||||||
use crate::parse::CliArgs;
|
use crate::parse::CliArgs;
|
||||||
|
|
@ -56,9 +57,11 @@ where
|
||||||
{
|
{
|
||||||
let arg_schema = Schema::create::<S>().expect("Invalid schema!");
|
let arg_schema = Schema::create::<S>().expect("Invalid schema!");
|
||||||
|
|
||||||
let args = CliArgs::from_args(&arg_schema, std::env::args()).expect("todo");
|
let args = CliArgs::from_args(&arg_schema, std::env::args());
|
||||||
|
match args {
|
||||||
BadArgs { args }
|
Ok(args) => BadArgs { args },
|
||||||
|
Err(err) => reporting::report(err),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
@ -89,6 +92,11 @@ impl BadArgs {
|
||||||
let long_name = T::long();
|
let long_name = T::long();
|
||||||
self.args.get::<T::Content>(long_name)
|
self.args.get::<T::Content>(long_name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get all unnamed additional arguments
|
||||||
|
pub fn unnamed(&self) -> &[String] {
|
||||||
|
self.args.unnamed()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
@ -123,6 +131,8 @@ mod sealed {
|
||||||
}
|
}
|
||||||
|
|
||||||
mod error {
|
mod error {
|
||||||
|
use crate::schema::SchemaKind;
|
||||||
|
|
||||||
/// Invalid schema
|
/// Invalid schema
|
||||||
#[derive(Debug, Clone, Eq, PartialEq)]
|
#[derive(Debug, Clone, Eq, PartialEq)]
|
||||||
pub enum SchemaError {
|
pub enum SchemaError {
|
||||||
|
|
@ -133,10 +143,9 @@ mod error {
|
||||||
/// Invalid arguments provided
|
/// Invalid arguments provided
|
||||||
#[derive(Debug, Clone, Eq, PartialEq)]
|
#[derive(Debug, Clone, Eq, PartialEq)]
|
||||||
pub enum CallError {
|
pub enum CallError {
|
||||||
SingleMinus,
|
|
||||||
ShortFlagNotFound(char),
|
ShortFlagNotFound(char),
|
||||||
LongFlagNotFound(String),
|
LongFlagNotFound(String),
|
||||||
ExpectedValue(String),
|
ExpectedValue(String, SchemaKind),
|
||||||
INan(String),
|
INan(String),
|
||||||
UNan(String),
|
UNan(String),
|
||||||
CombinedShortWithValue(String),
|
CombinedShortWithValue(String),
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,8 @@ fn parse_shorts(
|
||||||
|
|
||||||
parse_value(command.kind, results, &command.long, args)?;
|
parse_value(command.kind, results, &command.long, args)?;
|
||||||
} else {
|
} else {
|
||||||
return Err(CallError::SingleMinus);
|
// '-' is a valid argument, like the `cat -`
|
||||||
|
results.unnamed.push("-".to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
for flag in all_shorts {
|
for flag in all_shorts {
|
||||||
|
|
@ -106,13 +107,13 @@ fn parse_value(
|
||||||
SchemaKind::String => {
|
SchemaKind::String => {
|
||||||
let string = args
|
let string = args
|
||||||
.next()
|
.next()
|
||||||
.ok_or_else(|| CallError::ExpectedValue(long.to_string()))?;
|
.ok_or_else(|| CallError::ExpectedValue(long.to_string(), kind))?;
|
||||||
results.insert(long, Box::new(string));
|
results.insert(long, Box::new(string));
|
||||||
}
|
}
|
||||||
SchemaKind::INum => {
|
SchemaKind::INum => {
|
||||||
let integer = args
|
let integer = args
|
||||||
.next()
|
.next()
|
||||||
.ok_or_else(|| CallError::ExpectedValue(long.to_string()))?
|
.ok_or_else(|| CallError::ExpectedValue(long.to_string(), kind))?
|
||||||
.parse::<isize>()
|
.parse::<isize>()
|
||||||
.map_err(|_| CallError::INan(long.to_string()))?;
|
.map_err(|_| CallError::INan(long.to_string()))?;
|
||||||
results.insert(long, Box::new(integer))
|
results.insert(long, Box::new(integer))
|
||||||
|
|
@ -120,7 +121,7 @@ fn parse_value(
|
||||||
SchemaKind::UNum => {
|
SchemaKind::UNum => {
|
||||||
let integer = args
|
let integer = args
|
||||||
.next()
|
.next()
|
||||||
.ok_or_else(|| CallError::ExpectedValue(long.to_string()))?
|
.ok_or_else(|| CallError::ExpectedValue(long.to_string(), kind))?
|
||||||
.parse::<usize>()
|
.parse::<usize>()
|
||||||
.map_err(|_| CallError::UNan(long.to_string()))?;
|
.map_err(|_| CallError::UNan(long.to_string()))?;
|
||||||
results.insert(long, Box::new(integer))
|
results.insert(long, Box::new(integer))
|
||||||
|
|
|
||||||
26
src/reporting.rs
Normal file
26
src/reporting.rs
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
use crate::error::CallError;
|
||||||
|
use crate::schema::SchemaKind;
|
||||||
|
|
||||||
|
pub fn report(err: CallError) -> ! {
|
||||||
|
match err {
|
||||||
|
CallError::ShortFlagNotFound(arg) => println!("error: argument '{}' does not exist.", arg),
|
||||||
|
CallError::LongFlagNotFound(arg) => println!("error: argument '{}' does not exist.", arg),
|
||||||
|
CallError::ExpectedValue(arg, kind) => {
|
||||||
|
println!(
|
||||||
|
"error: argument '{}' expected {} value, but got nothing.",
|
||||||
|
arg,
|
||||||
|
match kind {
|
||||||
|
SchemaKind::String => "string",
|
||||||
|
SchemaKind::Bool => unreachable!(),
|
||||||
|
SchemaKind::INum => "integer",
|
||||||
|
SchemaKind::UNum => "positive integer",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
CallError::INan(arg) => println!("error: argument '{}' expected a positive integer value, but got an invalid positive integer.", arg),
|
||||||
|
CallError::UNan(arg) => println!("error: argument '{}' expected an integer value, but got an invalid integer.", arg),
|
||||||
|
CallError::CombinedShortWithValue(arg) => println!("error: using argument expecting value '{}' in position where only flags are allowed", arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
std::process::exit(1)
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue