lab_resource_manager/domain/ports/repositories/
errors.rs

1use crate::domain::aggregates::resource_usage::errors::ResourceUsageError;
2use crate::domain::common::value_objects::errors::EmailAddressError;
3use crate::domain::errors::DomainError;
4use crate::domain::ports::error::PortError;
5use std::fmt;
6
7#[derive(Debug)]
8pub enum RepositoryError {
9    NotFound,
10    ConnectionError(String),
11    /// 無効なメールアドレス
12    InvalidEmail(EmailAddressError),
13    /// ResourceUsageのドメインルール違反
14    InvalidResourceUsage(ResourceUsageError),
15    Unknown(String),
16}
17
18impl fmt::Display for RepositoryError {
19    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
20        match self {
21            RepositoryError::NotFound => write!(f, "リソースが見つかりません"),
22            RepositoryError::ConnectionError(msg) => write!(f, "接続エラー: {}", msg),
23            RepositoryError::InvalidEmail(e) => write!(f, "無効なメールアドレス: {}", e),
24            RepositoryError::InvalidResourceUsage(e) => {
25                write!(f, "リソース使用のドメインルール違反: {}", e)
26            }
27            RepositoryError::Unknown(msg) => write!(f, "不明なエラー: {}", msg),
28        }
29    }
30}
31
32impl std::error::Error for RepositoryError {
33    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
34        match self {
35            RepositoryError::InvalidEmail(e) => Some(e),
36            RepositoryError::InvalidResourceUsage(e) => Some(e),
37            _ => None,
38        }
39    }
40}
41
42impl From<EmailAddressError> for RepositoryError {
43    fn from(e: EmailAddressError) -> Self {
44        RepositoryError::InvalidEmail(e)
45    }
46}
47
48impl From<ResourceUsageError> for RepositoryError {
49    fn from(e: ResourceUsageError) -> Self {
50        RepositoryError::InvalidResourceUsage(e)
51    }
52}
53
54impl DomainError for RepositoryError {}
55impl PortError for RepositoryError {}