use crate::{connector, device, serialization};
use anomaly::{BoxError, Context};
use thiserror::Error;
pub type Error = crate::Error<ErrorKind>;
#[derive(Copy, Clone, Debug, Eq, Error, PartialEq)]
pub enum ErrorKind {
#[error("authentication failed")]
AuthenticationError,
#[error("session closed")]
ClosedError,
#[error("max commands per session exceeded")]
CommandLimitExceeded,
#[error("couldn't create session")]
CreateFailed,
#[error("HSM error")]
DeviceError,
#[error("session ID mismatch")]
MismatchError,
#[error("protocol error")]
ProtocolError,
#[error("HSM response error")]
ResponseError,
#[error("cryptographic verification failed")]
VerifyFailed,
}
impl ErrorKind {
pub fn context(self, source: impl Into<BoxError>) -> Context<ErrorKind> {
Context::new(self, Some(source.into()))
}
}
impl From<connector::Error> for Error {
fn from(err: connector::Error) -> Self {
ErrorKind::ProtocolError.context(err).into()
}
}
impl From<device::ErrorKind> for Error {
fn from(kind: device::ErrorKind) -> Self {
ErrorKind::DeviceError.context(kind).into()
}
}
impl From<serialization::Error> for Error {
fn from(err: serialization::Error) -> Self {
ErrorKind::ProtocolError.context(err).into()
}
}