use thiserror::Error;
#[derive(Debug, Error, PartialEq)]
pub enum DominantColorError {
#[error("图片为空,没有可处理的像素")]
EmptyImage,
#[error("请求 {requested} 种颜色,但图片中只有 {available} 种唯一颜色")]
TooFewColors {
requested: usize,
available: usize,
},
#[error("算法内部错误:{message}")]
InternalError {
message: String,
},
}
pub type Result<T> = std::result::Result<T, DominantColorError>;
impl DominantColorError {
pub(crate) fn internal(msg: impl Into<String>) -> Self {
Self::InternalError { message: msg.into() }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_display_empty_image() {
let e = DominantColorError::EmptyImage;
assert!(e.to_string().contains("空"));
}
#[test]
fn test_display_too_few_colors() {
let e = DominantColorError::TooFewColors { requested: 10, available: 3 };
let s = e.to_string();
assert!(s.contains("10") && s.contains("3"));
}
#[test]
fn test_display_internal_error() {
let e = DominantColorError::internal("发生了意料之外的错误");
assert!(e.to_string().contains("发生了意料之外的错误"));
}
#[test]
fn test_equality() {
assert_eq!(DominantColorError::EmptyImage, DominantColorError::EmptyImage);
assert_ne!(
DominantColorError::EmptyImage,
DominantColorError::TooFewColors { requested: 1, available: 0 }
);
}
}