#![cfg_attr(docsrs, feature(doc_cfg))]
#![warn(missing_docs)]
#![deny(unsafe_code)]
pub mod error;
pub mod macros;
pub mod ok;
pub use error::{CodexError, IntoCodex};
pub use ok::{CodexOk, CodexOkRaw, CodexOkWrap, ExecutionContext};
#[cfg(feature = "serde")]
pub use ok::log_codex_ok;
pub type Result<T, E = CodexError> = std::result::Result<CodexOk<T>, E>;
#[cfg(test)]
mod tests {
use crate::codex_ok;
use super::{codex_bail, codex_ensure, Result};
fn test_bail_function(val: i32) -> Result<i32> {
if val < 0 {
codex_bail!("VAL_ERROR", "Value is negative", "val" => val.to_string());
}
codex_ok!(val)
}
fn test_ensure_function(val: i32) -> Result<i32> {
codex_ensure!(val >= 0, "VAL_ERROR", "Value must be non-negative", "val" => val.to_string());
codex_ok!(val)
}
#[test]
fn test_codex_bail() {
let result = test_bail_function(-1);
assert!(result.is_err());
match result {
Err(err) => {
assert_eq!(err.name(), "VAL_ERROR");
assert_eq!(err.cause(), "Value is negative");
if let Some(meta) = err.metadata().get("val") {
assert_eq!(meta, "-1");
}
}
Ok(_) => panic!("Expected an error"),
}
}
#[test]
fn test_codex_ensure_success() {
let result = test_ensure_function(10);
assert!(result.is_ok());
match result {
Ok(val) => assert_eq!(val.value, 10),
Err(err) => panic!("Unexpected error: {err}"),
}
}
#[test]
fn test_codex_ensure_failure() {
let result = test_ensure_function(-5);
assert!(result.is_err());
match result {
Err(err) => {
assert_eq!(err.name(), "VAL_ERROR");
assert_eq!(err.cause(), "Value must be non-negative");
if let Some(meta) = err.metadata().get("val") {
assert_eq!(meta, "-5");
}
}
Ok(_) => panic!("Expected an error"),
}
}
}