use error::*;
use flags::command::{Command, CommandResult};
use flags::parse_and_execute::parse_and_execute;
use flags::parse_and_execute::parse_and_execute_command;
use std::env;
use std::fmt::{Debug, Display};
use std::process;
pub const EXIT_SUCCESS: i32 = 0;
pub const EXIT_FAILURE: i32 = 1;
pub fn get_program_parameters() -> Vec<String> {
env::args()
.skip(1) .collect()
}
pub fn handle_result<E: Display + Debug>(r: Result<CommandResult<E>>) -> i32 {
match r {
Ok(command_result) => match command_result {
Ok(_) => EXIT_SUCCESS,
Err(e) => {
eprintln!(
"{}",
match cfg!(debug_assertions) {
false => e.to_string(),
true => format!("{:?}", e),
}
);
EXIT_FAILURE
}
},
Err(e) => {
eprintln!(
"Flag parsing error: {}",
match cfg!(debug_assertions) {
false => e.to_string(),
true => format!("{:?}", e),
}
);
EXIT_FAILURE
}
}
}
pub fn main_impl_multiple_commands<E: Display + Debug>(commands: Vec<Command<E>>) -> ! {
process::exit(handle_result(parse_and_execute_command(
env::args().next().unwrap().as_ref(),
&get_program_parameters(),
commands,
Some(::std::io::stderr()),
)));
}
pub fn main_impl_single_command<E: Display + Debug>(command: Command<E>) -> ! {
process::exit(handle_result(parse_and_execute(
env::args().next().unwrap().as_ref(),
&get_program_parameters(),
command,
Some(::std::io::stderr()),
)));
}