1use std::io;
4use thiserror::Error;
5
6#[derive(Error, Debug)]
8pub enum Error {
9 #[error("IO error: {0}")]
11 Io(#[from] io::Error),
12
13 #[error("MIME type error: {0}")]
15 MimeType(String),
16
17 #[error("Media type error: {0}")]
19 MediaType(String),
20
21 #[error("Encoding error: {0}")]
23 Encoding(String),
24
25 #[error("Multipart error: {0}")]
27 Multipart(String),
28
29 #[error("Invalid parameter: {0}")]
31 InvalidParameter(String),
32
33 #[error("Message too large")]
35 MessageTooLarge,
36}
37
38pub type Result<T> = std::result::Result<T, Error>;
40
41#[derive(Error, Debug)]
43#[error("Invalid media parameter")]
44pub struct InvalidMediaParameter;
45
46impl From<InvalidMediaParameter> for Error {
47 fn from(_: InvalidMediaParameter) -> Self {
48 Error::MediaType("invalid media parameter".to_string())
49 }
50}
51
52#[cfg(test)]
53mod tests {
54 use super::*;
55 use std::io;
56
57 #[test]
58 fn test_error_display() {
59 let err = Error::MimeType("invalid type".to_string());
61 assert_eq!(err.to_string(), "MIME type error: invalid type");
62
63 let err = Error::MediaType("invalid media".to_string());
65 assert_eq!(err.to_string(), "Media type error: invalid media");
66
67 let err = Error::Encoding("invalid encoding".to_string());
69 assert_eq!(err.to_string(), "Encoding error: invalid encoding");
70
71 let err = Error::Multipart("invalid multipart".to_string());
73 assert_eq!(err.to_string(), "Multipart error: invalid multipart");
74
75 let err = Error::InvalidParameter("invalid param".to_string());
77 assert_eq!(err.to_string(), "Invalid parameter: invalid param");
78
79 let err = Error::MessageTooLarge;
81 assert_eq!(err.to_string(), "Message too large");
82 }
83
84 #[test]
85 fn test_io_error_conversion() {
86 let io_err = io::Error::new(io::ErrorKind::NotFound, "file not found");
88 let err: Error = io_err.into();
89 assert!(matches!(err, Error::Io(_)));
90 assert!(err.to_string().contains("file not found"));
91 }
92
93 #[test]
94 fn test_invalid_media_parameter_conversion() {
95 let param_err = InvalidMediaParameter;
97 let err: Error = param_err.into();
98 assert!(matches!(err, Error::MediaType(_)));
99 assert_eq!(err.to_string(), "Media type error: invalid media parameter");
100 }
101
102 #[test]
103 fn test_error_debug() {
104 let err = Error::MimeType("test".to_string());
106 let debug_str = format!("{:?}", err);
107 assert!(debug_str.contains("MimeType"));
108 }
109
110 #[test]
111 fn test_result_type() {
112 let ok_result: Result<i32> = Ok(42);
114 assert_eq!(ok_result.unwrap(), 42);
115
116 let err_result: Result<i32> = Err(Error::MimeType("error".to_string()));
117 assert!(err_result.is_err());
118 }
119}