/rust/registry/src/index.crates.io-1949cf8c6b5b557f/dotenvy-0.15.7/src/errors.rs
Line | Count | Source |
1 | | use std::env; |
2 | | use std::error; |
3 | | use std::fmt; |
4 | | use std::io; |
5 | | |
6 | | pub type Result<T> = std::result::Result<T, Error>; |
7 | | |
8 | | #[derive(Debug)] |
9 | | #[non_exhaustive] |
10 | | pub enum Error { |
11 | | LineParse(String, usize), |
12 | | Io(io::Error), |
13 | | EnvVar(env::VarError), |
14 | | } |
15 | | |
16 | | impl Error { |
17 | 0 | pub fn not_found(&self) -> bool { |
18 | 0 | if let Error::Io(ref io_error) = *self { |
19 | 0 | return io_error.kind() == io::ErrorKind::NotFound; |
20 | 0 | } |
21 | 0 | false |
22 | 0 | } |
23 | | } |
24 | | |
25 | | impl error::Error for Error { |
26 | 0 | fn source(&self) -> Option<&(dyn error::Error + 'static)> { |
27 | 0 | match self { |
28 | 0 | Error::Io(err) => Some(err), |
29 | 0 | Error::EnvVar(err) => Some(err), |
30 | 0 | _ => None, |
31 | | } |
32 | 0 | } |
33 | | } |
34 | | |
35 | | impl fmt::Display for Error { |
36 | 0 | fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { |
37 | 0 | match self { |
38 | 0 | Error::Io(err) => write!(fmt, "{}", err), |
39 | 0 | Error::EnvVar(err) => write!(fmt, "{}", err), |
40 | 0 | Error::LineParse(line, error_index) => write!( |
41 | 0 | fmt, |
42 | 0 | "Error parsing line: '{}', error at line index: {}", |
43 | | line, error_index |
44 | | ), |
45 | | } |
46 | 0 | } |
47 | | } |
48 | | |
49 | | #[cfg(test)] |
50 | | mod test { |
51 | | use std::env; |
52 | | use std::error::Error as StdError; |
53 | | use std::io; |
54 | | |
55 | | use super::*; |
56 | | |
57 | | #[test] |
58 | | fn test_io_error_source() { |
59 | | let err = Error::Io(io::ErrorKind::PermissionDenied.into()); |
60 | | let io_err = err.source().unwrap().downcast_ref::<io::Error>().unwrap(); |
61 | | assert_eq!(io::ErrorKind::PermissionDenied, io_err.kind()); |
62 | | } |
63 | | |
64 | | #[test] |
65 | | fn test_envvar_error_source() { |
66 | | let err = Error::EnvVar(env::VarError::NotPresent); |
67 | | let var_err = err |
68 | | .source() |
69 | | .unwrap() |
70 | | .downcast_ref::<env::VarError>() |
71 | | .unwrap(); |
72 | | assert_eq!(&env::VarError::NotPresent, var_err); |
73 | | } |
74 | | |
75 | | #[test] |
76 | | fn test_lineparse_error_source() { |
77 | | let err = Error::LineParse("test line".to_string(), 2); |
78 | | assert!(err.source().is_none()); |
79 | | } |
80 | | |
81 | | #[test] |
82 | | fn test_error_not_found_true() { |
83 | | let err = Error::Io(io::ErrorKind::NotFound.into()); |
84 | | assert!(err.not_found()); |
85 | | } |
86 | | |
87 | | #[test] |
88 | | fn test_error_not_found_false() { |
89 | | let err = Error::Io(io::ErrorKind::PermissionDenied.into()); |
90 | | assert!(!err.not_found()); |
91 | | } |
92 | | |
93 | | #[test] |
94 | | fn test_io_error_display() { |
95 | | let err = Error::Io(io::ErrorKind::PermissionDenied.into()); |
96 | | let io_err: io::Error = io::ErrorKind::PermissionDenied.into(); |
97 | | |
98 | | let err_desc = format!("{}", err); |
99 | | let io_err_desc = format!("{}", io_err); |
100 | | assert_eq!(io_err_desc, err_desc); |
101 | | } |
102 | | |
103 | | #[test] |
104 | | fn test_envvar_error_display() { |
105 | | let err = Error::EnvVar(env::VarError::NotPresent); |
106 | | let var_err = env::VarError::NotPresent; |
107 | | |
108 | | let err_desc = format!("{}", err); |
109 | | let var_err_desc = format!("{}", var_err); |
110 | | assert_eq!(var_err_desc, err_desc); |
111 | | } |
112 | | |
113 | | #[test] |
114 | | fn test_lineparse_error_display() { |
115 | | let err = Error::LineParse("test line".to_string(), 2); |
116 | | let err_desc = format!("{}", err); |
117 | | assert_eq!( |
118 | | "Error parsing line: 'test line', error at line index: 2", |
119 | | err_desc |
120 | | ); |
121 | | } |
122 | | } |