serde-error

Crates.ioserde-error
lib.rsserde-error
version0.1.3
sourcesrc
created_at2021-01-10 00:19:47.847779
updated_at2024-10-25 12:56:34.735653
descriptionSerde (de)serializer for Error types
homepage
repositoryhttps://github.com/Ekleog/serde-error
max_upload_size
id337468
size5,505
Léo Gaspard (Ekleog)

documentation

https://docs.rs/serde-error

README

serde-error

serde-error provides a (de)serializable Error type implementing std::error::Error, that can easily be used to transmit errors over the wire.

Should I use this?

This crate is production-grade. However, you probably do not want to use it: usually, it makes much more sense to just sum up the error as some type, instead of serializing the whole causality chain.

The use case for which this crate was designed is running Rust WebAssembly blobs inside a Rust wasmtime-running host. In such a case the causality chain is clearly kept across the serialization boundary, and it thus makes sense to keep it all.

In some other cases it may make sense to serialize the whole causality chain, but most often it makes most sense to just not serialize errors.

As such, please use serde-error with parsimony.

How should I use this?

use anyhow::Context;
use std::error::Error;

fn foo() -> anyhow::Result<()> {
    // ...
    Err(anyhow::anyhow!("Failed smurfing the smurfs"))
}

fn bar() -> anyhow::Result<()> {
    // ...
    foo().context("Running foo")
}

fn main() {
    if let Err(returned_err) = bar() {
        let s = bincode::serialize(&serde_error::Error::new(&*returned_err))
            .expect("Serializing error");
        let d: serde_error::Error = bincode::deserialize(&s)
            .expect("Deserializing error");
        let e = anyhow::Error::from(d);
        assert_eq!(e.to_string(), "Running foo");
        assert_eq!(e.source().unwrap().to_string(), "Failed smurfing the smurfs");
    } else {
        panic!("bar did not return an error");
    }
}
Commit count: 10

cargo fmt