use crate::{connector, device, serialization, session};
use failure::Fail;
use std::{error::Error as StdError, io};
pub type Error = crate::Error<ErrorKind>;
#[derive(Copy, Clone, Eq, PartialEq, Debug, Fail)]
pub enum ErrorKind {
#[fail(display = "authentication failed")]
AuthenticationError,
#[fail(display = "session closed")]
ClosedSessionError,
#[fail(display = "connection error")]
ConnectorError {
kind: connector::ErrorKind,
},
#[fail(display = "couldn't create session")]
CreateFailed,
#[fail(display = "HSM error: {}", kind)]
DeviceError {
kind: device::ErrorKind,
},
#[fail(display = "protocol error")]
ProtocolError,
#[fail(display = "HSM error")]
ResponseError,
}
impl ErrorKind {
pub fn device_error(self) -> Option<device::ErrorKind> {
match self {
ErrorKind::DeviceError { kind } => Some(kind),
_ => None,
}
}
}
impl From<connector::Error> for Error {
fn from(err: connector::Error) -> Self {
let kind = ErrorKind::ConnectorError { kind: err.kind() };
err!(kind, err.description())
}
}
impl From<session::Error> for Error {
fn from(err: session::Error) -> Self {
let kind = match err.kind() {
session::ErrorKind::AuthenticationError => ErrorKind::AuthenticationError,
session::ErrorKind::ClosedError => ErrorKind::ClosedSessionError,
session::ErrorKind::CreateFailed => ErrorKind::CreateFailed,
session::ErrorKind::DeviceError { kind } => ErrorKind::DeviceError { kind },
session::ErrorKind::ProtocolError
| session::ErrorKind::CommandLimitExceeded
| session::ErrorKind::MismatchError
| session::ErrorKind::VerifyFailed => ErrorKind::ProtocolError,
session::ErrorKind::ResponseError => ErrorKind::ResponseError,
};
err!(kind, err.description())
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Self {
err!(ErrorKind::ProtocolError, err.description())
}
}
impl From<serialization::Error> for Error {
fn from(err: serialization::Error) -> Self {
err!(ErrorKind::ProtocolError, err.description())
}
}
impl From<Error> for signatory::Error {
fn from(client_error: Error) -> signatory::Error {
signatory::Error::from_cause(client_error)
}
}