From 17d4de461ba468feda484321665fd9836e78efdd Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Fri, 12 Jun 2026 00:27:16 +0200 Subject: [PATCH] feat(domain): DomainError::is_transient() for retry classification --- crates/domain/src/errors.rs | 41 +++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/crates/domain/src/errors.rs b/crates/domain/src/errors.rs index 611dca7..7e96e0a 100644 --- a/crates/domain/src/errors.rs +++ b/crates/domain/src/errors.rs @@ -20,3 +20,44 @@ pub enum DomainError { #[error("Forbidden: {0}")] Forbidden(String), } + +impl DomainError { + pub fn is_transient(&self) -> bool { + matches!(self, DomainError::InfrastructureError(_)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn infrastructure_error_is_transient() { + assert!(DomainError::InfrastructureError("network timeout".into()).is_transient()); + } + + #[test] + fn not_found_is_not_transient() { + assert!(!DomainError::NotFound("thing".into()).is_transient()); + } + + #[test] + fn validation_error_is_not_transient() { + assert!(!DomainError::ValidationError("bad input".into()).is_transient()); + } + + #[test] + fn unauthorized_is_not_transient() { + assert!(!DomainError::Unauthorized("token expired".into()).is_transient()); + } + + #[test] + fn forbidden_is_not_transient() { + assert!(!DomainError::Forbidden("no access".into()).is_transient()); + } + + #[test] + fn invalid_rating_is_not_transient() { + assert!(!DomainError::InvalidRating { max: 5, given: 9 }.is_transient()); + } +}