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}