#[macro_use] extern crate rust_util;

mod util;
mod tx;
mod credit;
mod credit_util;
mod engine;
mod engine_plugin_credit;

mod cmd_genkey;
mod cmd_credit_create;
mod cmd_credit_issue;
mod cmd_credit_transfer;
mod cmd_credit_query;
mod cmd_credit_queryall;

use clap::{App, Arg, ArgMatches};
use rust_util::{XResult, util_clap::{CommandError, CommandExecutor, DefaultCommand}};

pub struct DefaultCommandImpl;
impl DefaultCommand for DefaultCommandImpl {
    fn process_command<'a>(&self, app: App<'a, 'a>) -> App<'a, 'a> {
        app.arg(Arg::with_name("verbose").long("verbose").short("v").multiple(true).help("Show verbose info"))
    }

    fn run(&self, arg_matches: &ArgMatches) -> CommandError {
        let verbose_count = arg_matches.occurrences_of("verbose");
        information!("Verbose count: {}", verbose_count);
        information!("Try use help (--help) print usage");
        Ok(None)
    }
}

fn main() -> XResult<()> {
    let mut c = CommandExecutor::new(Some(Box::new(DefaultCommandImpl)));
    c.add(Box::new(cmd_genkey::CommandImpl));
    c.add(Box::new(cmd_credit_create::CommandImpl));
    c.add(Box::new(cmd_credit_issue::CommandImpl));
    c.add(Box::new(cmd_credit_transfer::CommandImpl));
    c.add(Box::new(cmd_credit_query::CommandImpl));
    c.add(Box::new(cmd_credit_queryall::CommandImpl));

    c.run()
}
