1use std::io;
24
25use thiserror::Error;
26
27#[derive(Debug, Error)]
29pub enum TwygError {
30 #[error("invalid time format '{format}': {source}")]
32 InvalidTimeFormat {
33 format: String,
34 #[source]
35 source: io::Error,
36 },
37
38 #[error("failed to initialize logger")]
40 InitError,
41
42 #[error("failed to open log file: {0}")]
44 FileError(#[from] io::Error),
45
46 #[error("configuration error: {0}")]
48 ConfigError(String),
49}
50
51pub type Result<T> = std::result::Result<T, TwygError>;
53
54#[cfg(test)]
55mod tests {
56 use super::*;
57
58 #[test]
59 fn test_error_display() {
60 let err = TwygError::ConfigError("test error".to_string());
61 assert_eq!(err.to_string(), "configuration error: test error");
62 }
63
64 #[test]
65 fn test_file_error() {
66 let io_err = io::Error::new(io::ErrorKind::NotFound, "file not found");
67 let err = TwygError::FileError(io_err);
68 assert!(err.to_string().contains("failed to open log file"));
69 }
70
71 #[test]
72 fn test_invalid_time_format() {
73 let io_err = io::Error::new(io::ErrorKind::InvalidInput, "bad format");
74 let err = TwygError::InvalidTimeFormat {
75 format: "%Z".to_string(),
76 source: io_err,
77 };
78 assert!(err.to_string().contains("invalid time format"));
79 assert!(err.to_string().contains("%Z"));
80 }
81}