signatory/
error.rs

1//! Error type
2
3use core::fmt::{self, Display};
4
5/// Result type
6pub type Result<T> = core::result::Result<T, Error>;
7
8/// Error type
9#[derive(Debug)]
10#[non_exhaustive]
11pub enum Error {
12    /// Algorithm is invalid.
13    AlgorithmInvalid,
14
15    /// Duplicate key in keyring.
16    DuplicateKey,
17
18    /// ECDSA errors.
19    #[cfg(feature = "ecdsa")]
20    Ecdsa,
21
22    /// Key name is invalid.
23    KeyNameInvalid,
24
25    /// I/O errors
26    #[cfg(feature = "std")]
27    Io(std::io::Error),
28
29    /// Expected a directory, found something else
30    #[cfg(feature = "std")]
31    NotADirectory,
32
33    /// Parse errors for raw/non-PKCS#8 keys.
34    Parse,
35
36    /// Permissions error, not required mode
37    #[cfg(feature = "std")]
38    Permissions,
39
40    /// PKCS#8 errors
41    Pkcs8(pkcs8::Error),
42}
43
44impl Display for Error {
45    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46        match self {
47            Self::AlgorithmInvalid => f.write_str("invalid algorithm"),
48            Self::DuplicateKey => f.write_str("duplicate key"),
49            #[cfg(feature = "ecdsa")]
50            Self::Ecdsa => f.write_str("ECDSA error"),
51            Self::KeyNameInvalid => f.write_str("invalid key name"),
52            #[cfg(feature = "std")]
53            Self::Io(err) => write!(f, "{}", err),
54            #[cfg(feature = "std")]
55            Self::NotADirectory => f.write_str("not a directory"),
56            Self::Parse => f.write_str("parse error"),
57            #[cfg(feature = "std")]
58            Self::Permissions => f.write_str("invalid file permissions"),
59            Self::Pkcs8(err) => write!(f, "{}", err),
60        }
61    }
62}
63
64#[cfg(feature = "std")]
65impl std::error::Error for Error {}
66
67#[cfg(feature = "ecdsa")]
68impl From<ecdsa::Error> for Error {
69    fn from(_: ecdsa::Error) -> Error {
70        Error::Ecdsa
71    }
72}
73
74impl From<pkcs8::Error> for Error {
75    fn from(err: pkcs8::Error) -> Error {
76        Error::Pkcs8(err)
77    }
78}
79
80impl From<pkcs8::der::Error> for Error {
81    fn from(err: pkcs8::der::Error) -> Error {
82        Error::Pkcs8(err.into())
83    }
84}
85
86impl From<pkcs8::der::pem::Error> for Error {
87    fn from(err: pkcs8::der::pem::Error) -> Error {
88        pkcs8::der::Error::from(err).into()
89    }
90}
91
92#[cfg(feature = "std")]
93impl From<std::io::Error> for Error {
94    fn from(err: std::io::Error) -> Error {
95        Error::Io(err)
96    }
97}