ckb-cli 1.4.0

ckb command line interface
pub mod account;
pub mod api_server;
pub mod dao;
pub mod deploy;
pub mod mock_tx;
pub mod molecule;
pub mod plugin;
pub mod pubsub;
pub mod rpc;
pub mod sudt;
pub mod tx;
pub mod util;
pub mod wallet;

pub use account::AccountSubCommand;
pub use api_server::ApiServerSubCommand;
pub use dao::DAOSubCommand;
pub use deploy::DeploySubCommand;
pub use mock_tx::MockTxSubCommand;
pub use molecule::MoleculeSubCommand;
pub use plugin::PluginSubCommand;
pub use pubsub::PubSubCommand;
pub use rpc::RpcSubCommand;
pub use sudt::SudtSubCommand;
pub use tx::TxSubCommand;
pub use util::UtilSubCommand;
pub use wallet::{TransferArgs, WalletSubCommand};

use clap::ArgMatches;
use serde::Serialize;

use crate::utils::printer::{OutputFormat, Printable};

pub struct Output {
    stdout: Option<serde_json::Value>,
    stderr: Option<serde_json::Value>,
    success: bool,
}

impl Output {
    pub fn new_success() -> Output {
        Output {
            stdout: None,
            stderr: None,
            success: true,
        }
    }

    pub fn new_output<T: Serialize>(value: T) -> Output {
        Output {
            stdout: Some(serde_json::to_value(value).expect("serialize stdout error")),
            stderr: None,
            success: false,
        }
    }

    pub fn new_error<T: Serialize>(value: T) -> Output {
        Output {
            stdout: None,
            stderr: Some(serde_json::to_value(value).expect("serialize stderr error")),
            success: false,
        }
    }

    pub fn print(&self, format: OutputFormat, color: bool) {
        if let Some(ref stdout) = self.stdout {
            println!("{}", stdout.render(format, color));
        }
        if let Some(ref stderr) = self.stderr {
            eprintln!("{}", stderr.render(format, color));
        }
        if self.success {
            let resp = serde_json::json!({
                "status": "success",
            });
            eprintln!("{}", resp.render(OutputFormat::Yaml, color));
        }
    }
}

pub trait CliSubCommand {
    fn process(&mut self, matches: &ArgMatches, debug: bool) -> Result<Output, String>;
}