use std::error::Error;
use std::fmt::Display;
use zhc_utils::small::SmallVec;
use crate::{Dialect, ValId};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Failure<D: Dialect> {
UnknownValue(ValId),
InactiveValue(ValId),
SignatureMismatch {
expected: SmallVec<D::TypeSystem>,
actual: SmallVec<D::TypeSystem>,
},
DepthOverflow,
}
impl<D: Dialect> Display for Failure<D> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::UnknownValue(valid) => write!(f, "Unknown value: {valid}"),
Self::InactiveValue(valid) => write!(f, "Inactive value: {valid}"),
Self::SignatureMismatch { expected, actual } => {
write!(
f,
"Signature error: received {actual} instead of {expected}"
)
}
Self::DepthOverflow => {
write!(
f,
"Overflow occurred while computing the depth of a new operation"
)
}
}
}
}
impl<D: Dialect> Error for Failure<D> {}