error-stack 0.2.4

A context-aware error-handling library that supports arbitrary attached user data
Documentation
#![cfg_attr(nightly, feature(provide_any))]
#![cfg_attr(all(nightly, feature = "std"), feature(error_generic_member_access))]

mod common;
use core::fmt::{Display, Formatter};

use common::*;
use error_stack::{report, Context, Report};

#[derive(Debug)]
struct Error;

impl Display for Error {
    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
        f.write_str("Error")
    }
}

impl Context for Error {}

#[test]
fn extend_one_nested() {
    let mut err1 = report!(Error).attach_printable("Not Supported");
    let err2 = report!(Error).attach_printable("Not Supported");
    let mut err3 = report!(Error).attach_printable("Not Supported");

    let count = expect_count(2) * 3;

    err1.extend_one(err2);
    err3.extend_one(err1);

    assert_eq!(err3.current_frames().len(), 3);
    assert_eq!(err3.frames().count(), count);
}

#[test]
fn extend_one() {
    let mut err1 = report!(Error).attach_printable("Not Supported");
    let err2 = report!(Error).attach_printable("Not Supported");
    let err3 = report!(Error).attach_printable("Not Supported");

    let count = expect_count(2) * 3;

    err1.extend_one(err2);
    err1.extend_one(err3);

    assert_eq!(err1.current_frames().len(), 3);
    assert_eq!(err1.frames().count(), count);
}

#[test]
fn extend() {
    let mut err1 = report!(Error).attach_printable("Not Supported");
    let err2 = report!(Error).attach_printable("Not Supported");
    let err3 = report!(Error).attach_printable("Not Supported");

    err1.extend([err2, err3]);
    assert_eq!(err1.current_frames().len(), 3);
    assert_eq!(err1.frames().count(), expect_count(2) * 3);
}

#[test]
fn collect() {
    let report: Option<Report<Error>> = vec![report!(Error), report!(Error), report!(Error)]
        .into_iter()
        .collect();

    let report = report.expect("should be some");
    assert_eq!(report.current_frames().len(), 3);
    assert_eq!(report.frames().count(), expect_count(1) * 3);
}

#[test]
fn collect_none() {
    let report: Option<Report<Error>> = vec![].into_iter().collect();

    assert!(report.is_none());
}