use runtime::Runtime;
use clap::App;
use failure::Fallible as Result;
pub trait ImagApplication {
fn run(rt: Runtime) -> Result<()>;
fn build_cli<'a>(app: App<'a, 'a>) -> App<'a, 'a>;
fn name() -> &'static str;
fn version() -> &'static str;
fn description() -> &'static str;
}
#[macro_export]
macro_rules! simple_imag_application_binary {
($application_library:ident, $application_implementor:ident) => {
extern crate libimagerror;
extern crate failure;
extern crate $application_library;
use failure::{Error, Fallible as Result, ResultExt};
fn main() {
use libimagerror::trace::MapErrTrace;
use libimagrt::application::ImagApplication;
use libimagrt::setup::generate_runtime_setup;
use $application_library::$application_implementor;
let version = make_imag_version!();
let rt = generate_runtime_setup($application_implementor::name(),
&version,
$application_implementor::description(),
$application_implementor::build_cli);
$application_implementor::run(rt)
.context(format!("Failed to run {}", $application_implementor::name()))
.map_err(Error::from)
.map_err_trace_exit_unwrap();
}
};
}