aro-core 1.0.0

Core domain layer for the Aro web framework
Documentation
//! Repository error types.

use std::error::Error;

/// Errors that can occur in repository operations.
#[derive(Debug, thiserror::Error)]
pub enum RepoError {
    /// The requested entity was not found.
    #[error("entity not found")]
    NotFound,

    /// A conflicting entity already exists (e.g. duplicate unique key).
    #[error("entity conflict")]
    Conflict,

    /// A validation rule was violated.
    #[error("validation error: {0}")]
    ValidationError(String),

    /// An unexpected error occurred.
    #[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");
    }
}