ecla 1.0.0

Easily build command line apps
Documentation

use parser::Parser;
use show_help_tips;
use command::Command;
use flag::Flag;


/// Command line application
///
#[derive(Debug)]
pub struct App {
    help: String,
    version: String,
    parser: Parser
}

impl App {
    /// Create a new command line application.
    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
    }

    /// Get sub command
    pub fn get_command(&self, name: &str) -> Option<Command> {
        self.parser.get_command(name)
    }

    /// Check arguments if has flags
    pub fn has_flag(&self) -> bool {
        self.parser.has_flag()
    }

    /// If you can not find any supported sub commands or flags,
    /// you can use this to tell user something is wrong.
    pub fn show_unknown_or_help(&self) {
        if self.has_command() {
            self.show_command_unknown();
        } else if self.has_flag() {
            self.show_help();
        }
    }

    /// Check arguments if has sub command
    pub fn has_command(&self) -> bool {
        ! self.parser.no_command()
    }

    /// Get flag
    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

    }

    /// Tell user is entering an unknown sub command
    pub fn show_command_unknown(&self) {
        errors!("unknown sub command: {}", self.parser.get_unknown_command().get_name());
        show_help_tips();
    }

    /// Print help message
    pub fn show_help(&self) {
        println!("{}", self.help);
    }

    /// Print version
    pub fn show_version(&self) {
        println!("{}", self.version);
    }
}