lab_resource_manager/application/
error.rs

1use crate::domain::aggregates::identity_link::errors::IdentityLinkError;
2use crate::domain::aggregates::resource_usage::errors::ResourceUsageError;
3use crate::domain::ports::{
4    notifier::NotificationError, repositories::RepositoryError,
5    resource_collection_access::ResourceCollectionAccessError,
6};
7use std::fmt;
8
9#[derive(Debug)]
10pub enum ApplicationError {
11    // Infrastructure層からのエラー
12    Repository(RepositoryError),
13    Notification(NotificationError),
14    ResourceCollectionAccess(ResourceCollectionAccessError),
15
16    // Domain層からのエラー(集約ごと)
17    ResourceUsage(ResourceUsageError),
18    IdentityLink(IdentityLinkError),
19
20    // UseCase固有のビジネスルール違反
21    /// 外部システムが既に紐付けられている
22    ExternalSystemAlreadyLinked {
23        email: String,
24        external_system: String,
25    },
26}
27
28impl fmt::Display for ApplicationError {
29    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
30        match self {
31            ApplicationError::Repository(e) => write!(f, "リポジトリエラー: {}", e),
32            ApplicationError::Notification(e) => write!(f, "通知エラー: {}", e),
33            ApplicationError::ResourceCollectionAccess(e) => {
34                write!(f, "リソースコレクションアクセスエラー: {}", e)
35            }
36            ApplicationError::ResourceUsage(e) => write!(f, "リソース使用エラー: {}", e),
37            ApplicationError::IdentityLink(e) => write!(f, "ID紐付けエラー: {}", e),
38            ApplicationError::ExternalSystemAlreadyLinked {
39                email,
40                external_system,
41            } => {
42                write!(
43                    f,
44                    "メールアドレス {} は既に {} に紐付けられています",
45                    email, external_system
46                )
47            }
48        }
49    }
50}
51
52impl std::error::Error for ApplicationError {
53    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
54        match self {
55            ApplicationError::Repository(e) => Some(e),
56            ApplicationError::Notification(e) => Some(e),
57            ApplicationError::ResourceCollectionAccess(e) => Some(e),
58            ApplicationError::ResourceUsage(e) => Some(e),
59            ApplicationError::IdentityLink(e) => Some(e),
60            ApplicationError::ExternalSystemAlreadyLinked { .. } => None,
61        }
62    }
63}
64
65impl From<RepositoryError> for ApplicationError {
66    fn from(e: RepositoryError) -> Self {
67        ApplicationError::Repository(e)
68    }
69}
70
71impl From<ResourceUsageError> for ApplicationError {
72    fn from(e: ResourceUsageError) -> Self {
73        ApplicationError::ResourceUsage(e)
74    }
75}
76
77impl From<IdentityLinkError> for ApplicationError {
78    fn from(e: IdentityLinkError) -> Self {
79        ApplicationError::IdentityLink(e)
80    }
81}
82
83impl From<NotificationError> for ApplicationError {
84    fn from(e: NotificationError) -> Self {
85        ApplicationError::Notification(e)
86    }
87}
88
89impl From<ResourceCollectionAccessError> for ApplicationError {
90    fn from(e: ResourceCollectionAccessError) -> Self {
91        ApplicationError::ResourceCollectionAccess(e)
92    }
93}