use crate::{error::ErrorKind, tests::traits::ErrorImpl};
use std::fmt::Debug;
use anyhow::Error;
pub(in crate::tests) fn check_err<T1, Err1, T2>(
result: &Result<T1, Err1>,
expected: &Result<T2, ErrorKind>,
) -> Result<(), Error>
where
T1: Debug,
Err1: ErrorImpl,
T2: Debug,
{
let result = result.as_ref();
let expected = expected.as_ref();
match (result, expected) {
(Err(error), Err(expected_kind)) => {
let kind = error.kind();
let (result_errno, expected_errno) = (kind.errno(), expected_kind.errno());
if kind != *expected_kind && result_errno != expected_errno {
anyhow::bail!(
"expected error {expected_kind:?} (errno: {expected_errno:?}) but got {error:?} (kind: {kind:?}, errno: {result_errno:?})"
);
}
}
(Ok(_), Ok(_)) => (),
(result, expected) => anyhow::bail!("expected {expected:?} but got {result:?}"),
}
Ok(())
}