main.rs
57 lines
| 1.6 KiB
| application/rls-services+xml
|
RustLexer
Antoine Cezar
|
r45593 | use clap::App; | ||
use clap::AppSettings; | ||||
use clap::SubCommand; | ||||
Antoine Cezar
|
r45515 | mod commands; | ||
mod error; | ||||
Antoine Cezar
|
r45503 | mod exitcode; | ||
Antoine Cezar
|
r45592 | mod ui; | ||
Antoine Cezar
|
r45593 | use commands::Command; | ||
Antoine Cezar
|
r45503 | |||
fn main() { | ||||
Antoine Cezar
|
r45593 | let mut app = App::new("rhg") | ||
.setting(AppSettings::AllowInvalidUtf8) | ||||
.setting(AppSettings::SubcommandRequired) | ||||
.setting(AppSettings::VersionlessSubcommands) | ||||
.version("0.0.1") | ||||
.subcommand( | ||||
SubCommand::with_name("root").about(commands::root::HELP_TEXT), | ||||
Antoine Cezar
|
r45924 | ) | ||
.subcommand( | ||||
SubCommand::with_name("files").about(commands::files::HELP_TEXT), | ||||
Antoine Cezar
|
r45593 | ); | ||
let matches = app.clone().get_matches_safe().unwrap_or_else(|_| { | ||||
std::process::exit(exitcode::UNIMPLEMENTED_COMMAND) | ||||
}); | ||||
Antoine Cezar
|
r45920 | let ui = ui::Ui::new(); | ||
Antoine Cezar
|
r45593 | let command_result = match matches.subcommand_name() { | ||
Some(name) => match name { | ||||
Antoine Cezar
|
r45920 | "root" => commands::root::RootCommand::new(&ui).run(), | ||
Antoine Cezar
|
r45924 | "files" => commands::files::FilesCommand::new(&ui).run(), | ||
Antoine Cezar
|
r45593 | _ => std::process::exit(exitcode::UNIMPLEMENTED_COMMAND), | ||
}, | ||||
_ => { | ||||
match app.print_help() { | ||||
Ok(_) => std::process::exit(exitcode::OK), | ||||
Err(_) => std::process::exit(exitcode::ABORT), | ||||
}; | ||||
} | ||||
}; | ||||
match command_result { | ||||
Ok(_) => std::process::exit(exitcode::OK), | ||||
Antoine Cezar
|
r45920 | Err(e) => { | ||
let message = e.get_error_message_bytes(); | ||||
if let Some(msg) = message { | ||||
match ui.write_stderr(&msg) { | ||||
Ok(_) => (), | ||||
Err(_) => std::process::exit(exitcode::ABORT), | ||||
}; | ||||
}; | ||||
e.exit() | ||||
} | ||||
Antoine Cezar
|
r45593 | } | ||
Antoine Cezar
|
r45503 | } | ||