1use core::fmt::{self, Display};
4
5pub type Result<T> = core::result::Result<T, Error>;
7
8#[derive(Debug)]
10#[non_exhaustive]
11pub enum Error {
12 AlgorithmInvalid,
14
15 DuplicateKey,
17
18 #[cfg(feature = "ecdsa")]
20 Ecdsa,
21
22 KeyNameInvalid,
24
25 #[cfg(feature = "std")]
27 Io(std::io::Error),
28
29 #[cfg(feature = "std")]
31 NotADirectory,
32
33 Parse,
35
36 #[cfg(feature = "std")]
38 Permissions,
39
40 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}