1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
use data_encoding::DecodeError;
use std::io;
use std::path::Path;
use thiserror::Error;
#[derive(Error, Debug, PartialEq, Eq)]
pub enum Error {
#[error("bad signature")]
BadSignature,
#[error("encoding: {0}")]
Encoding(String),
#[error("illegal argument: {0}")]
IllegalArgument(String),
#[error("no supported hash algorithm")]
NoSupportedHashAlgorithm,
#[error("not found")]
NotFound,
#[error("opaque: {0}")]
Opaque(String),
#[error("programming: {0}")]
Programming(String),
#[error("target unavailable")]
TargetUnavailable,
#[error("unknown hash algorithm: {0}")]
UnknownHashAlgorithm(String),
#[error("unknown key type: {0}")]
UnknownKeyType(String),
#[error("verification failure: {0}")]
VerificationFailure(String),
#[error("prefix selection failure: {0}")]
LinkGatheringError(String),
}
impl From<serde_json::error::Error> for Error {
fn from(err: serde_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 {
match err.kind() {
std::io::ErrorKind::NotFound => Error::NotFound,
_ => Error::Opaque(format!("IO: {:?}", err)),
}
}
}
impl From<http::Error> for Error {
fn from(err: http::Error) -> Error {
Error::Opaque(format!("Http: {:?}", err))
}
}
impl From<hyper::Error> for Error {
fn from(err: hyper::Error) -> 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))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn verify_io_error_display_string() {
let err = Error::from(io::Error::from(std::io::ErrorKind::NotFound));
assert_eq!(err.to_string(), "not found");
assert_eq!(Error::NotFound.to_string(), "not found");
let err = Error::from(io::Error::from(std::io::ErrorKind::PermissionDenied));
assert_eq!(err.to_string(), "opaque: IO: Kind(PermissionDenied)");
}
}