xcli 0.5.2

xcli, a CLI implementation based on rustyline
Documentation
use log::{info, LevelFilter};
use xcli::*;

fn main() {
    env_logger::init();

    info!("cli started");

    let mut app = App::new("xCLI")
        .version("v0.1")
        .author("kingwel.xie@139.com");

    app.add_subcommand(
        Command::new_with_alias("test1", "t1")
            .about("controls testing features")
            .action(|_app, _| -> XcliResult {
                println!("tested");
                log::set_max_level(LevelFilter::Info);
                Ok(CmdExeCode::Ok)
            }),
    );

    app.add_subcommand(
        Command::new_with_alias("mismatch", "mm")
            .about("controls testing features")
            .action(|_app, args| -> XcliResult {
                Err(XcliError::MismatchArgument(10, args.len()))
            }),
    );

    app.add_subcommand(
        Command::new_with_alias("bad", "b")
            .about("controls testing features")
            .action(|_app, _args| -> XcliResult {
                Err(XcliError::BadArgument("bad".into()))
            }),
    );

    app.add_subcommand(
        Command::new_with_alias("missing", "mm")
            .about("controls testing features")
            .action(|_app, _args| -> XcliResult {
                Err(XcliError::MissingArgument)
            }),
    );

    app.add_subcommand_with_userdata(
        Command::new_with_alias("userdata", "ud")
            .about("controls testing features")
            .action(|app, _args| -> XcliResult {
                let data_any = app.get_handler("userdata").unwrap();

                let data = data_any.downcast_ref::<usize>().expect("usize");

                println!("userdata = {}", data);
                Ok(CmdExeCode::Ok)
            }),
        Box::new(100usize)
    );

    app.run();
}