secret_loader/error.rs
1// Copyright (c) The secret-loader Contributors
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4use std::env::VarError;
5use std::error::Error;
6use std::fmt::Display;
7use std::fmt::Error as FmtError;
8use std::fmt::Formatter;
9use std::io::Error as IoError;
10
11/// A possible error value while loading a `Secret` from a [`SecretLoader`](crate::SecretLoader)
12///
13/// Produced by the `TryFrom<SecretLoader>` implementation for [`SecretString`](secrecy::SecretString)
14///
15/// # Examples
16///
17/// ```
18/// use std::convert::TryFrom;
19/// use std::convert::TryInto;
20///
21/// use secrecy::SecretString;
22/// use secret_loader::LoadError;
23/// use secret_loader::SecretLoader;
24///
25/// let plain_cred = SecretLoader::new("insecurepassword");
26/// let secret: SecretString = plain_cred.try_into().expect("Plaintext credentials always convert");
27///
28/// // Env var may be missing
29/// let env_cred = SecretLoader::new("env:MISSING_KEY");
30/// let env_error = SecretString::try_from(env_cred).expect_err("Env var is not set");
31/// assert!(matches!(env_error, LoadError::Env(_)));
32///
33/// // File may not available
34/// let file_cred = SecretLoader::new("file:/does/not/exist");
35/// let file_error = SecretString::try_from(file_cred).expect_err("File is missing");
36/// assert!(matches!(file_error, LoadError::Io(_)));
37/// ```
38#[derive(Debug)]
39#[non_exhaustive]
40pub enum LoadError {
41 /// An IO error was encountered while attempting to read from a file
42 Io(IoError),
43 /// A `VarError` was encountered while attempting to read from the environment
44 Env(VarError),
45}
46
47impl Display for LoadError {
48 fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), FmtError> {
49 match self {
50 Self::Io(_) => write!(f, "Io Error"),
51 Self::Env(_) => write!(f, "Env Error"),
52 }
53 }
54}
55
56impl Error for LoadError {
57 fn source(&self) -> Option<&(dyn Error + 'static)> {
58 match self {
59 Self::Io(e) => Some(e),
60 Self::Env(e) => Some(e),
61 }
62 }
63}
64
65impl From<IoError> for LoadError {
66 fn from(e: IoError) -> Self {
67 Self::Io(e)
68 }
69}
70
71impl From<VarError> for LoadError {
72 fn from(e: VarError) -> Self {
73 Self::Env(e)
74 }
75}