6 releases

Uses new Rust 2024

new 0.1.5 May 23, 2025
0.1.4 May 23, 2025
0.0.1 Jul 17, 2024

#202 in WebAssembly


Used in 9 crates (8 directly)

Custom license

36KB
295 lines

cdumay_core

License: BSD-3-Clause cdumay_core on crates.io cdumay_core on docs.rs Source Code Repository

cdumay_core is a lightweight crate that provides custom Error and Result types as drop-in replacements for Rust’s standard std::result::Result and std::error::Error, with the primary goal of supporting serialization and deserialization via serde.

Motivation

Rust's standard error types do not implement Serialize and Deserialize due to their generic and trait-based nature. This crate provides concrete, serializable alternatives suitable for applications like:

  • Returning structured errors from APIs (e.g., HTTP, RPC, WebAssembly)
  • Communicating errors across process boundaries

Features

  • Error — A serializable error type with a message and optional cause.
  • Result<T> — A simple alias for crate::result::Result<T, Error>, fully serializable.
  • Full support for serde::{Serialize, Deserialize}.
  • Optional integration with external crates via feature flags.

Example

use cdumay_core::{ErrorBuilder, Result};

fn do_work() -> Result<i32> {
    Err(
        ErrorBuilder::default()
            .with_message("Something went wrong".to_string())
            .build()
    ).into()
}

Optional Features

  • utoipa: Implement utoipa::ToSchema to Error
  • actix-web: Allow to use Result and Error with actix

Compatibility

This crate is designed for applications that require custom serialization logic. It is not a full replacement for std::result::Result in all use cases, especially where standard error traits are expected.

Macros

Use the provided derive macros to define your error and error kind structs:

use cdumay_core::{define_errors, define_kinds};

define_kinds! {
    UnknownError = (500, "Unexpected error"),
    IoError = (500, "IO error")
}

define_errors! {
    Unexpected = UnknownError,
    FileRead = IoError,
    Forbidden = (IoError, 403), // kind code overwrite 500 -> 403
    FileNotFound = (IoError, 404, "File not found") // kind description overwrite
}

Dependencies

~0.5–12MB
~137K SLoC