error-stack-macros2 0.1.0

Community-made procedural macros for error-stack.
Documentation

error-stack-macros2

crates.io latest version crates.io downloads Tests status Contributor Covenant Code of Conduct

Community-made procedural macros for error-stack.

Example

Here is the same example shown in the error-stack README, modified to use the macros provided by this crate:

use error_stack::{Report, ResultExt};
use error_stack_macros2::Error;

#[derive(Debug, Error)]
#[display("invalid experiment description")]
struct ParseExperimentError;

fn parse_experiment(
    description: &str
) -> Result<(u64, u64), Report<ParseExperimentError>> {
    let value = description
        .parse::<u64>()
        .attach_with(|| {
            format!("{description:?} could not be parsed as experiment")
        })
        .change_context(ParseExperimentError)?;

    Ok((value, 2 * value))
}

#[derive(Debug, Error)]
#[display("experiment error: could not run experiment")]
struct ExperimentError;

fn start_experiments(
    experiment_ids: &[usize],
    experiment_descriptions: &[&str],
) -> Result<Vec<u64>, Report<ExperimentError>> {
    let experiments = experiment_ids
        .iter()
        .map(|exp_id| {
            let description = experiment_descriptions
                .get(*exp_id)
                .ok_or_else(|| {
                    Report::new(ExperimentError)
                        .attach(format!(
                            "experiment {exp_id} has no valid description")
                        )
                })?;

            let experiment = parse_experiment(description)
                .attach(format!("experiment {exp_id} could not be parsed"))
                .change_context(ExperimentError)?;

            Ok(move || experiment.0 * experiment.1)
        })
        .collect::<Result<Vec<_>, Report<ExperimentError>>>()
        .attach("unable to set up experiments")?;

    Ok(experiments.iter().map(|experiment| experiment()).collect())
}

let experiment_ids = &[0, 2];
let experiment_descriptions = &["10", "20", "3o"];
let err = start_experiments(experiment_ids, experiment_descriptions)
    .unwrap_err();

assert_eq!(err.to_string(), "experiment error: could not run experiment");

Support

Need help using error-stack-macros2? Don't hesitate to reach out on GitHub Discussions!

Links

Contributing

Before creating an issue, please consider the following:

Disclaimer

This crate is not affiliated with the official error-stack crate or its maintainers.