Skip to main content

authn_resolver/domain/
error.rs

1//! Domain errors for the `AuthN` resolver.
2
3use authn_resolver_sdk::AuthNResolverError;
4use modkit_macros::domain_model;
5
6/// Internal domain errors.
7#[domain_model]
8#[derive(thiserror::Error, Debug)]
9pub enum DomainError {
10    #[error("types registry is not available: {0}")]
11    TypesRegistryUnavailable(String),
12
13    #[error("no plugin instances found for vendor '{vendor}'")]
14    PluginNotFound { vendor: String },
15
16    #[error("invalid plugin instance content for '{gts_id}': {reason}")]
17    InvalidPluginInstance { gts_id: String, reason: String },
18
19    #[error("plugin not available for '{gts_id}': {reason}")]
20    PluginUnavailable { gts_id: String, reason: String },
21
22    #[error("unauthorized: {0}")]
23    Unauthorized(String),
24
25    #[error("internal error: {0}")]
26    Internal(String),
27}
28
29impl From<types_registry_sdk::TypesRegistryError> for DomainError {
30    fn from(e: types_registry_sdk::TypesRegistryError) -> Self {
31        Self::Internal(e.to_string())
32    }
33}
34
35impl From<modkit::client_hub::ClientHubError> for DomainError {
36    fn from(e: modkit::client_hub::ClientHubError) -> Self {
37        Self::Internal(e.to_string())
38    }
39}
40
41impl From<serde_json::Error> for DomainError {
42    fn from(e: serde_json::Error) -> Self {
43        Self::Internal(e.to_string())
44    }
45}
46
47impl From<modkit::plugins::ChoosePluginError> for DomainError {
48    fn from(e: modkit::plugins::ChoosePluginError) -> Self {
49        match e {
50            modkit::plugins::ChoosePluginError::InvalidPluginInstance { gts_id, reason } => {
51                Self::InvalidPluginInstance { gts_id, reason }
52            }
53            modkit::plugins::ChoosePluginError::PluginNotFound { vendor } => {
54                Self::PluginNotFound { vendor }
55            }
56        }
57    }
58}
59
60impl From<AuthNResolverError> for DomainError {
61    fn from(e: AuthNResolverError) -> Self {
62        match e {
63            AuthNResolverError::Unauthorized(msg) => Self::Unauthorized(msg),
64            AuthNResolverError::NoPluginAvailable => Self::PluginNotFound {
65                vendor: "unknown".to_owned(),
66            },
67            AuthNResolverError::ServiceUnavailable(msg) => Self::PluginUnavailable {
68                gts_id: "unknown".to_owned(),
69                reason: msg,
70            },
71            AuthNResolverError::Internal(msg) => Self::Internal(msg),
72        }
73    }
74}
75
76impl From<DomainError> for AuthNResolverError {
77    fn from(e: DomainError) -> Self {
78        match e {
79            DomainError::PluginNotFound { .. } => Self::NoPluginAvailable,
80            DomainError::InvalidPluginInstance { gts_id, reason } => {
81                Self::Internal(format!("invalid plugin instance '{gts_id}': {reason}"))
82            }
83            DomainError::PluginUnavailable { gts_id, reason } => {
84                Self::ServiceUnavailable(format!("plugin not available for '{gts_id}': {reason}"))
85            }
86            DomainError::Unauthorized(msg) => Self::Unauthorized(msg),
87            DomainError::TypesRegistryUnavailable(reason) | DomainError::Internal(reason) => {
88                Self::Internal(reason)
89            }
90        }
91    }
92}