use crate::apdu::StatusWord;
pub type Result<T, E = Error> = core::result::Result<T, E>;
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum Error {
#[error("device returned status {0}")]
Status(StatusWord),
#[error("no device found")]
NoDevice,
#[error("device disconnected")]
Disconnected,
#[error("transport error: {0}")]
Transport(String),
#[error("timeout waiting for device")]
Timeout,
#[error("framing error: {0}")]
Framing(String),
#[error("invalid response: {0}")]
InvalidResponse(String),
#[error("invalid input: {0}")]
InvalidInput(String),
#[error("device must be on the dashboard (close any open app)")]
DashboardExpected,
#[error("action refused on device")]
UserRefused,
#[error("device is locked")]
Locked,
#[error("http error: {0}")]
Http(String),
#[error("websocket error: {0}")]
WebSocket(String),
#[error("hsm error: {0}")]
Hsm(String),
#[error("not found: {0}")]
NotFound(String),
#[error("cancelled")]
Cancelled,
#[error("{0}")]
App(String),
}
impl Error {
pub fn status(&self) -> Option<StatusWord> {
match self {
Error::Status(sw) => Some(*sw),
_ => None,
}
}
}
impl From<StatusWord> for Error {
fn from(sw: StatusWord) -> Self {
match sw {
StatusWord::LOCKED_DEVICE => Error::Locked,
sw => Error::Status(sw),
}
}
}
#[cfg(any(feature = "manager-api", feature = "hsm"))]
impl From<serde_json::Error> for Error {
fn from(e: serde_json::Error) -> Self {
Error::InvalidResponse(e.to_string())
}
}