badargs/
reporting.rs

1use crate::error::CallError;
2use crate::schema::{Schema, SchemaKind};
3
4pub fn report(err: CallError, schema: &Schema) -> ! {
5    match err {
6        CallError::ShortFlagNotFound(arg) => println!("error: argument '{}' does not exist.", arg),
7        CallError::LongFlagNotFound(arg) => println!("error: argument '{}' does not exist.", arg), 
8        CallError::ExpectedValue(arg, kind) => {
9            println!(
10                "error: argument '{}' expected {} value, but got nothing.",
11                arg,
12                match kind {
13                    SchemaKind::String => "string",
14                    SchemaKind::Bool => unreachable!(),
15                    SchemaKind::IInt => "integer",
16                    SchemaKind::UInt => "positive integer",
17                    SchemaKind::Num => "number"
18                }
19            )
20        }
21        CallError::INan(arg) => println!("error: argument '{}' expected a positive integer value, but got an invalid positive integer.", arg),
22        CallError::UNan(arg) => println!("error: argument '{}' expected an integer value, but got an invalid integer.", arg),
23        CallError::NNan(arg) => println!("error: argument '{}' expected a number value, but got an invalid number.", arg),
24        CallError::CombinedShortWithValue(arg) => println!("error: using argument expecting value '{}' in position where only flags are allowed", arg),
25        CallError::InvalidUtf8(os_str) => println!("error: invalid utf8: '{}'", os_str.to_string_lossy()),
26        CallError::HelpPage => {
27            println!("Options:");
28            for option in schema.arguments() {
29                print!("--{} ", option.long);
30                if let Some(short) = option.short {
31                    print!("(-{}) ", short);
32                }
33                match option.kind {
34                    SchemaKind::String => print!("[Takes a value]"),
35                    SchemaKind::Bool => {}
36                    SchemaKind::IInt => print!("[Takes an integer]"),
37                    SchemaKind::UInt => print!("[Takes a positive integer]"),
38                    SchemaKind::Num => print!("[Takes a number]"),
39                }
40                println!();
41            }
42            std::process::exit(0);
43        }
44    }
45
46    std::process::exit(1)
47}