tokio_mime/
error.rs

1//! Error types for the mime crate.
2
3use std::io;
4use thiserror::Error;
5
6/// The main error type for the mime crate.
7#[derive(Error, Debug)]
8pub enum Error {
9    /// IO error
10    #[error("IO error: {0}")]
11    Io(#[from] io::Error),
12
13    /// MIME type error
14    #[error("MIME type error: {0}")]
15    MimeType(String),
16
17    /// Media type error
18    #[error("Media type error: {0}")]
19    MediaType(String),
20
21    /// Encoding error
22    #[error("Encoding error: {0}")]
23    Encoding(String),
24
25    /// Multipart error
26    #[error("Multipart error: {0}")]
27    Multipart(String),
28
29    /// Invalid parameter
30    #[error("Invalid parameter: {0}")]
31    InvalidParameter(String),
32
33    /// Message too large
34    #[error("Message too large")]
35    MessageTooLarge,
36}
37
38/// Specialized Result type for mime operations.
39pub type Result<T> = std::result::Result<T, Error>;
40
41/// Error indicating invalid media parameter (used in media type parsing).
42#[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        // Test MimeType error
60        let err = Error::MimeType("invalid type".to_string());
61        assert_eq!(err.to_string(), "MIME type error: invalid type");
62
63        // Test MediaType error
64        let err = Error::MediaType("invalid media".to_string());
65        assert_eq!(err.to_string(), "Media type error: invalid media");
66
67        // Test Encoding error
68        let err = Error::Encoding("invalid encoding".to_string());
69        assert_eq!(err.to_string(), "Encoding error: invalid encoding");
70
71        // Test Multipart error
72        let err = Error::Multipart("invalid multipart".to_string());
73        assert_eq!(err.to_string(), "Multipart error: invalid multipart");
74
75        // Test InvalidParameter error
76        let err = Error::InvalidParameter("invalid param".to_string());
77        assert_eq!(err.to_string(), "Invalid parameter: invalid param");
78
79        // Test MessageTooLarge error
80        let err = Error::MessageTooLarge;
81        assert_eq!(err.to_string(), "Message too large");
82    }
83
84    #[test]
85    fn test_io_error_conversion() {
86        // Test IO error conversion
87        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        // Test InvalidMediaParameter conversion
96        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        // Test that errors implement Debug
105        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        // Test Result type alias
113        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}