use core::fmt;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum CodecFailure {
OutOfFuel,
LimitExceeded,
Trapped,
Rejected,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Error {
message: String,
codec_failure: Option<CodecFailure>,
}
impl Error {
pub fn new(message: impl Into<String>) -> Self {
Self {
message: message.into(),
codec_failure: None,
}
}
pub(crate) fn codec(kind: CodecFailure, message: impl Into<String>) -> Self {
Self {
message: message.into(),
codec_failure: Some(kind),
}
}
pub fn codec_failure(&self) -> Option<CodecFailure> {
self.codec_failure
}
pub(crate) fn context(self, context: impl fmt::Display) -> Self {
Self {
message: format!("{context}: {}", self.message),
codec_failure: self.codec_failure,
}
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(&self.message)
}
}
impl std::error::Error for Error {}
pub type Result<T> = core::result::Result<T, Error>;