macro_rules! run {
    ($func:expr) => { ... };
    ($func:expr, $master:expr) => { ... };
}
Expand description

Execute a function and return Result<func_data, String> Optionally: Add the error string to the master error string for later consumption, prefixed with the name of the function being called

Examples

#[macro_use]
extern crate kubos_service;
use kubos_service::run;
use failure::{Error, Fail};
use std::sync::{Arc, RwLock};

#[derive(Fail, Debug)]
pub enum RootError {
    #[fail(display = "RootError: {}", message)]
    RootError { message: String },
}

#[derive(Fail, Debug)]
pub enum TopError {
    #[fail(display = "TopError: {}", message)]
    Error {
        #[fail(cause)]
        cause: RootError,
        message: String,
    },
}

fn test_func(fail: bool, output: String) -> Result<String, Error> {
    match fail {
        true => {
            let chain: TopError = TopError::Error {
                cause: RootError::RootError { message: "root".to_owned() },
                message: "top".to_owned(),
            };

            Err(chain.into())
        }
        false => Ok(output),
    }
}

fn main() {
    let master_err = Arc::new(RwLock::new(vec![]));
    let result = run!(test_func(true, "test".to_owned()), master_err);

    assert_eq!(result, Err("TopError: top, RootError: root".to_owned()));
    assert_eq!(
        vec!["test_func (src/macros.rs:40): TopError: top, RootError: root".to_owned()],
        *master_err.read().unwrap()
    );
}