errjson 0.0.6

Easy complex and intuitive Rust Error json
Documentation
#![doc = include_str!("../README.md")]

// do not remove else error `use of undeclared crate or module `jsonerr` when call macro
pub use jsonerr;

#[derive(Debug, PartialEq)]
pub struct ErrJson {
    pub json: serde_json::Value,
}

impl ErrJson {
    pub fn new(json: serde_json::Value) -> ErrJson {
        ErrJson { json }
    }

    // see also err-to-json
    pub fn to_value(&self) -> serde_json::Value {
        self.json.clone()
    }
}

impl std::fmt::Display for ErrJson {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(f, "{}", serde_json::to_string(&self.json).unwrap())
    }
}

impl std::error::Error for ErrJson {}

#[macro_export]
macro_rules! ErrJson {
    // with meta
    (meta=$meta:expr, code=$code:expr, message=$message:expr) => {
        Err(Box::new(ErrJson::new(
            errjson::jsonerr::builder::JsonErrBuilder::new()
                .meta($meta.into())
                .code($code.into())
                .message($message.into())
                .build(),
        )))
    };

    (meta=$meta:expr, code=$code:expr, message=$message:expr, payload=$payload:expr) => {
        Err(Box::new(ErrJson::new(
            errjson::jsonerr::builder::JsonErrBuilder::new()
                .meta($meta.into())
                .code($code.into())
                .message($message.into())
                .payload($payload.into())
                .build(),
        )))
    };

    (meta=$meta:expr, code=$code:expr, message=$message:expr, payload=$payload:expr, origin=$origin:expr) => {
        Err(Box::new(ErrJson::new(
            errjson::jsonerr::builder::JsonErrBuilder::new()
                .meta($meta.into())
                .code($code.into())
                .message($message.into())
                .payload($payload.into())
                .origin($origin.into())
                .build(),
        )))
    };

    (meta=$meta:expr, code=$code:expr, message=$message:expr, origin=$origin:expr) => {
        Err(Box::new(ErrJson::new(
            errjson::jsonerr::builder::JsonErrBuilder::new()
                .meta($meta.into())
                .code($code.into())
                .message($message.into())
                .origin($origin.into())
                .build(),
        )))
    };

    // without meta
    (code=$code:expr, message=$message:expr) => {
        Err(Box::new(ErrJson::new(
            errjson::jsonerr::builder::JsonErrBuilder::new()
                .code($code.into())
                .message($message.into())
                .build(),
        )))
    };

    (code=$code:expr, message=$message:expr, payload=$payload:expr) => {
        Err(Box::new(ErrJson::new(
            errjson::jsonerr::builder::JsonErrBuilder::new()
                .code($code.into())
                .message($message.into())
                .payload($payload.into())
                .build(),
        )))
    };

    (code=$code:expr, message=$message:expr, payload=$payload:expr, origin=$origin:expr) => {
        Err(Box::new(ErrJson::new(
            errjson::jsonerr::builder::JsonErrBuilder::new()
                .code($code.into())
                .message($message.into())
                .payload($payload.into())
                .origin($origin.into())
                .build(),
        )))
    };

    (code=$code:expr, message=$message:expr, origin=$origin:expr) => {
        Err(Box::new(ErrJson::new(
            errjson::jsonerr::builder::JsonErrBuilder::new()
                .code($code.into())
                .message($message.into())
                .origin($origin.into())
                .build(),
        )))
    };
}