1use thiserror::Error;
2
3use crate::theme;
4
5#[derive(Error, Debug)]
7pub enum IdenticonError {
8 #[error("could not generate image")]
10 GenerateImageError,
11
12 #[error("could not save image")]
14 SaveImageError,
15
16 #[error("could not encode image")]
18 EncodeImageError,
19
20 #[error(
22 "identicon scale too small: {scale}, must be greater or equal to identicon size: {size}"
23 )]
24 ScaleTooSmallError {
25 scale: u32,
27 size: u32,
29 },
30
31 #[error("identicon size too large: {size}, must be less or equal to identicon scale: {scale}")]
33 SizeTooLargeError {
34 size: u32,
36 scale: u32,
38 },
39
40 #[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 }
99}