1use base64;
2use openssl;
3use serde_json;
4use std::fmt::Display;
5use std::string;
6use std::{error, io};
7
8pub type CryptResult<T> = Result<T, CryptError>;
9
10#[derive(Debug)]
11pub enum CryptError {
12 Io(io::Error),
13 Base64Decode(base64::DecodeError),
14 Str(string::FromUtf8Error),
15 Json(serde_json::Error),
16 OpenSSL(openssl::error::ErrorStack),
17 HasherNotFound(String),
18 CipherNotFound(String),
19 UnsupportedConfigVersion(),
20 DuplicationCipherConfigVersion(String),
21 DuplicationHasherConfigVersion(String),
22 UnsupportedCipherAlgorithm(String),
23 UnsupportedHasherAlgorithm(String),
24 BadIterationCount(),
25 InvalidDocument(String),
26 InvalidQuery(String),
27 OperationNotImplemented(String)
28 }
30
31macro_rules! impl_from_error {
32 ($f: ty, $e: expr) => {
33 impl From<$f> for CryptError {
34 fn from(f: $f) -> CryptError {
35 $e(f)
36 }
37 }
38 };
39}
40
41impl_from_error!(io::Error, CryptError::Io);
42impl_from_error!(base64::DecodeError, CryptError::Base64Decode);
43impl_from_error!(string::FromUtf8Error, CryptError::Str);
44impl_from_error!(serde_json::Error, CryptError::Json);
45impl_from_error!(openssl::error::ErrorStack, CryptError::OpenSSL);
46
47impl Display for CryptError {
48 fn fmt(&self, f: &mut ::std::fmt::Formatter) -> Result<(), ::std::fmt::Error> {
49 match *self {
50 CryptError::Io(ref err) => err.fmt(f),
51 CryptError::Base64Decode(ref err) => err.fmt(f),
52 CryptError::Str(ref err) => err.fmt(f),
53 CryptError::Json(ref err) => err.fmt(f),
54 CryptError::OpenSSL(ref err) => err.fmt(f),
55 CryptError::HasherNotFound(ref algorithm) => write!(f, "Hasher algorithm: {} not implemented", algorithm),
56 CryptError::CipherNotFound(ref algorithm) => write!(f, "Cipher algorithm: {} not implemented", algorithm),
57 CryptError::UnsupportedConfigVersion() => write!(f, "Crypt config version not supported"),
58 CryptError::DuplicationCipherConfigVersion(ref version) => write!(f, "Duplication of cipher config version: {}", version),
59 CryptError::DuplicationHasherConfigVersion(ref version) => write!(f, "Duplication of hasher config version: {}", version),
60 CryptError::UnsupportedCipherAlgorithm(ref algorithm) => write!(f, "Unsupported cipher algorithm: {}", algorithm),
61 CryptError::UnsupportedHasherAlgorithm(ref algorithm) => write!(f, "Unsupported hasher algorithm: {}", algorithm),
62 CryptError::BadIterationCount() => write!(f, "Bad iteration count"),
63 CryptError::InvalidDocument(ref reason) => write!(f, "Invalid document: {}", reason),
64 CryptError::InvalidQuery(ref reason) => write!(f, "Invalid query: {}", reason),
65 CryptError::OperationNotImplemented(ref info) => write!(f, "Operation not implemented: {}", info)
66 }
67 }
68}
69
70impl error::Error for CryptError {
71 fn description(&self) -> &str {
72 match *self {
73 CryptError::Io(ref err) => err.description(),
74 CryptError::Base64Decode(ref err) => err.description(),
75 CryptError::Str(ref err) => err.description(),
76 CryptError::Json(ref err) => err.description(),
77 CryptError::OpenSSL(ref err) => err.description(),
78 CryptError::HasherNotFound(ref _algorithm) => "Hasher algorithm not implemented",
79 CryptError::CipherNotFound(ref _algorithm) => "Cipher algorithm not implemented",
80 CryptError::UnsupportedConfigVersion() => "Crypt config version not supported",
81 CryptError::DuplicationCipherConfigVersion(ref _version) => "Duplication of cipher config version",
82 CryptError::DuplicationHasherConfigVersion(ref _version) => "Duplication of hasher config version",
83 CryptError::UnsupportedCipherAlgorithm(ref _algorithm) => "Unsupported cipher algorithm",
84 CryptError::UnsupportedHasherAlgorithm(ref _algorithm) => "Unsupported hasher algorithm",
85 CryptError::BadIterationCount() => "Bad iteration count",
86 CryptError::InvalidDocument(ref _reason) => "Invalid document",
87 CryptError::InvalidQuery(ref _reason) => "Invalid query",
88 CryptError::OperationNotImplemented(ref _info) => "Operation not implemented"
89 }
90 }
91
92 fn source(&self) -> Option<&(dyn error::Error + 'static)> {
93 match *self {
94 CryptError::Io(ref err) => Some(err),
95 CryptError::Base64Decode(ref err) => Some(err),
96 CryptError::Str(ref err) => Some(err),
97 CryptError::Json(ref err) => Some(err),
98 CryptError::OpenSSL(ref err) => Some(err),
99 _ => None
100 }
101 }
102}