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}