identicon_rs/
error.rs

1use thiserror::Error;
2
3use crate::theme;
4
5/// Identicon errors
6#[derive(Error, Debug)]
7pub enum IdenticonError {
8    /// Failed to generate the image.
9    #[error("could not generate image")]
10    GenerateImageError,
11
12    /// Failed to save the image to a file.
13    #[error("could not save image")]
14    SaveImageError,
15
16    /// Failed to encode the image.
17    #[error("could not encode image")]
18    EncodeImageError,
19
20    /// Indicates an issue with using a scale smaller than the size.
21    #[error(
22        "identicon scale too small: {scale}, must be greater or equal to identicon size: {size}"
23    )]
24    ScaleTooSmallError {
25        /// Attempted scale value.
26        scale: u32,
27        /// Currently set size value.
28        size: u32,
29    },
30
31    /// Indicates an issues with using a size larger than the scale.
32    #[error("identicon size too large: {size}, must be less or equal to identicon scale: {scale}")]
33    SizeTooLargeError {
34        /// Attempted size value.
35        size: u32,
36        /// Currently set scale value.
37        scale: u32,
38    },
39
40    /// Indicates an issue with the provided theme.
41    #[error(transparent)]
42    ThemeError(#[from] theme::error::ThemeError),
43}
44
45#[cfg(test)]
46mod tests {
47    use crate::{error::IdenticonError, theme::error::ThemeError};
48
49    #[test]
50    fn generate_image_error_works() {
51        let error = IdenticonError::GenerateImageError;
52        let expected_text = "could not generate image";
53        assert_eq!(expected_text, error.to_string());
54    }
55
56    #[test]
57    fn save_image_error_works() {
58        let error = IdenticonError::SaveImageError;
59        let expected_text = "could not save image";
60        assert_eq!(expected_text, error.to_string());
61    }
62
63    #[test]
64    fn encode_image_error_works() {
65        let error = IdenticonError::EncodeImageError;
66        let expected_text = "could not encode image";
67        assert_eq!(expected_text, error.to_string());
68    }
69
70    #[test]
71    fn scale_too_small_error_works() {
72        let error = IdenticonError::ScaleTooSmallError { scale: 3, size: 5 };
73        let expected_text =
74            "identicon scale too small: 3, must be greater or equal to identicon size: 5";
75        assert_eq!(expected_text, error.to_string());
76    }
77
78    #[test]
79    fn size_too_large_error_works() {
80        let error = IdenticonError::SizeTooLargeError { size: 5, scale: 3 };
81        let expected_text =
82            "identicon size too large: 5, must be less or equal to identicon scale: 3";
83        assert_eq!(expected_text, error.to_string());
84    }
85
86    #[test]
87    fn theme_error_works() {
88        let theme_error = ThemeError::ThemeProcessingError("bad field".to_string());
89        let identicon_error: IdenticonError = theme_error.into();
90        match identicon_error {
91            IdenticonError::ThemeError(inner_error) => match inner_error {
92                ThemeError::ThemeProcessingError(_) => (),
93                _ => panic!("wrong inner error type"),
94            },
95            _ => panic!("wrong error type"),
96        }
97        // assert_eq!(theme_error, identicon_error);
98    }
99}