use std::error::Error;
#[derive(Debug, thiserror::Error)]
pub enum RepoError {
#[error("entity not found")]
NotFound,
#[error("entity conflict")]
Conflict,
#[error("validation error: {0}")]
ValidationError(String),
#[error("unknown error: {0}")]
Unknown(Box<dyn Error + Send + Sync>),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn not_found_displays_message() {
let err = RepoError::NotFound;
assert_eq!(err.to_string(), "entity not found");
}
#[test]
fn conflict_displays_message() {
let err = RepoError::Conflict;
assert_eq!(err.to_string(), "entity conflict");
}
#[test]
fn validation_displays_message() {
let err = RepoError::ValidationError("name is required".to_string());
assert_eq!(err.to_string(), "validation error: name is required");
}
#[test]
fn unknown_displays_inner_error() {
let inner = std::io::Error::other("disk failure");
let err = RepoError::Unknown(Box::new(inner));
assert_eq!(err.to_string(), "unknown error: disk failure");
}
#[test]
fn repo_error_is_send() {
fn assert_send<T: Send>() {}
assert_send::<RepoError>();
}
#[test]
fn error_trait_is_implemented() {
let err: Box<dyn Error> = Box::new(RepoError::NotFound);
assert_eq!(err.to_string(), "entity not found");
}
}