hyperlit-base 0.1.0

A software documentation tool documentation embedded in source files - base crate
Documentation
use crate::error::HyperlitError;

pub type HyperlitResult<T> = Result<T, HyperlitError>;

pub use tracing::info;

#[macro_export]
macro_rules! context {
    ($fmt:expr $(, $($args:expr),+)? => $($stmts:stmt)+) => {
        (|| {
            $crate::result::info!($fmt $(, $($args),+)?);
            $($stmts)+
        })().map_err(|e| $crate::error::HyperlitError::from(e).change_context(format!(concat!("Failed to ",$fmt) $(, $($args),+)?)))
    };
}

#[cfg(test)]
mod tests {
    use crate::result::HyperlitResult;
    use crate::{bail, context};
    use std::env::set_var;
    use std::num::ParseFloatError;
    use std::str::FromStr;

    #[test]
    fn test_context_macro_ok() {
        let _result = {
            context!("grok stuff for {}", "bar" =>
                Ok::<i32, std::io::Error>(0)
            )
        }
        .unwrap();
    }

    #[test]
    fn test_context_macro_err() {
        unsafe { set_var("RUST_BACKTRACE", "1") };
        fn my_broken_function() -> HyperlitResult<u32> {
            bail!("ungrokkable");
        }
        let result = {
            context!("grok stuff for {}", "bar" => {
                my_broken_function()
            })
        }
        .expect_err("Should have errored, but was");
        assert_eq!("Failed to grok stuff for bar", result.to_string());
        assert!(format!("{:?}", result).contains("my_broken_function"));
    }

    #[test]
    fn test_context_macro_err2() {
        fn my_broken_function() -> Result<f32, ParseFloatError> {
            f32::from_str("xyz")
        }
        let result = {
            context!("grok stuff for {}", "bar" => {
                my_broken_function()
            })
        }
        .expect_err("Should have errored, but was");
        assert_eq!("Failed to grok stuff for bar", result.to_string());
    }
}