crypt_config/
error.rs

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  // ...
29}
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}