use data_encoding::DecodeError;
use derp;
use hyper;
use json;
use std::fmt;
use std::io;
use std::path::Path;
use tempfile;
use metadata::Role;
#[derive(Debug, PartialEq, Eq)]
pub enum Error {
BadSignature,
Encoding(String),
ExpiredMetadata(Role),
IllegalArgument(String),
MissingMetadata(Role),
NoSupportedHashAlgorithm,
NotFound,
Opaque(String),
Programming(String),
TargetUnavailable,
VerificationFailure(String),
}
impl ::std::error::Error for Error {
fn description(&self) -> &str {
match *self {
Error::BadSignature => "bad signature",
Error::Encoding(_) => "encoding",
Error::ExpiredMetadata(_) => "expired metadata",
Error::IllegalArgument(_) => "illegal argument",
Error::MissingMetadata(_) => "missing metadata",
Error::NoSupportedHashAlgorithm => "no supported hash algorithm",
Error::NotFound => "not found",
Error::Opaque(_) => "opaque",
Error::Programming(_) => "programming",
Error::TargetUnavailable => "target unavailable",
Error::VerificationFailure(_) => "verification failure",
}
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Debug::fmt(self, f)
}
}
impl From<json::error::Error> for Error {
fn from(err: json::error::Error) -> Error {
Error::Encoding(format!("JSON: {:?}", err))
}
}
impl Error {
pub fn from_io(err: io::Error, path: &Path) -> Error {
Error::Opaque(format!("Path {:?} : {:?}", path, err))
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Error {
Error::Opaque(format!("IO: {:?}", err))
}
}
impl From<hyper::error::Error> for Error {
fn from(err: hyper::error::Error) -> Error {
Error::Opaque(format!("Hyper: {:?}", err))
}
}
impl From<hyper::error::ParseError> for Error {
fn from(err: hyper::error::ParseError) -> Error {
Error::Opaque(format!("Hyper: {:?}", err))
}
}
impl From<DecodeError> for Error {
fn from(err: DecodeError) -> Error {
Error::Encoding(format!("{:?}", err))
}
}
impl From<derp::Error> for Error {
fn from(err: derp::Error) -> Error {
Error::Encoding(format!("DER: {:?}", err))
}
}
impl From<tempfile::PersistError> for Error {
fn from(err: tempfile::PersistError) -> Error {
Error::Opaque(format!("Error persisting temp file: {:?}", err))
}
}