use parser::Parser;
use show_help_tips;
use command::Command;
use flag::Flag;
#[derive(Debug)]
pub struct App {
help: String,
version: String,
parser: Parser
}
impl App {
pub fn new<T: Into<String>>(help: T, version: T) -> App {
let app = App {
help: help.into(),
version: version.into(),
parser: Parser::new()
};
if app.parser.no_args() || app.parser.get_flag("--help").is_some() {
app.show_help();
exit!(0);
}
if app.parser.get_flag("--version").is_some() {
app.show_version();
exit!(0);
}
app
}
pub fn get_command(&self, name: &str) -> Option<Command> {
self.parser.get_command(name)
}
pub fn has_flag(&self) -> bool {
self.parser.has_flag()
}
pub fn show_unknown_or_help(&self) {
if self.has_command() {
self.show_command_unknown();
} else if self.has_flag() {
self.show_help();
}
}
pub fn has_command(&self) -> bool {
! self.parser.no_command()
}
pub fn get_flag<T: AsRef<str>>(&self, names: &[T]) -> Option<Flag> {
for name in names.into_iter() {
let flag = self.parser.get_flag(name.as_ref());
if flag.is_some() {
return flag;
}
}
None
}
pub fn show_command_unknown(&self) {
errors!("unknown sub command: {}", self.parser.get_unknown_command().get_name());
show_help_tips();
}
pub fn show_help(&self) {
println!("{}", self.help);
}
pub fn show_version(&self) {
println!("{}", self.version);
}
}