cdumay_core

Crates.iocdumay_core
lib.rscdumay_core
version0.1.6
created_at2024-07-17 13:35:34.824894+00
updated_at2025-05-26 12:34:59.137324+00
descriptionA Rust Library for standard code
homepagehttps://github.com/cdumay/cdumay_core
repositoryhttps://github.com/cdumay/cdumay_core
max_upload_size
id1306181
size81,843
Cédric Dumay (cdumay)

documentation

https://docs.rs/cdumay_core

README

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
}
Commit count: 13

cargo fmt