Skip to main content

authz_resolver/domain/
error.rs

1//! Domain errors for the `AuthZ` resolver.
2
3use authz_resolver_sdk::AuthZResolverError;
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("internal error: {0}")]
23    Internal(String),
24}
25
26impl From<types_registry_sdk::TypesRegistryError> for DomainError {
27    fn from(e: types_registry_sdk::TypesRegistryError) -> Self {
28        Self::Internal(e.to_string())
29    }
30}
31
32impl From<modkit::client_hub::ClientHubError> for DomainError {
33    fn from(e: modkit::client_hub::ClientHubError) -> Self {
34        Self::Internal(e.to_string())
35    }
36}
37
38impl From<serde_json::Error> for DomainError {
39    fn from(e: serde_json::Error) -> Self {
40        Self::Internal(e.to_string())
41    }
42}
43
44impl From<modkit::plugins::ChoosePluginError> for DomainError {
45    fn from(e: modkit::plugins::ChoosePluginError) -> Self {
46        match e {
47            modkit::plugins::ChoosePluginError::InvalidPluginInstance { gts_id, reason } => {
48                Self::InvalidPluginInstance { gts_id, reason }
49            }
50            modkit::plugins::ChoosePluginError::PluginNotFound { vendor } => {
51                Self::PluginNotFound { vendor }
52            }
53        }
54    }
55}
56
57impl From<AuthZResolverError> for DomainError {
58    fn from(e: AuthZResolverError) -> Self {
59        match e {
60            AuthZResolverError::NoPluginAvailable => Self::PluginNotFound {
61                vendor: "unknown".to_owned(),
62            },
63            AuthZResolverError::ServiceUnavailable(msg) => Self::PluginUnavailable {
64                gts_id: "unknown".to_owned(),
65                reason: msg,
66            },
67            AuthZResolverError::Internal(msg) => Self::Internal(msg),
68        }
69    }
70}
71
72impl From<DomainError> for AuthZResolverError {
73    fn from(e: DomainError) -> Self {
74        match e {
75            DomainError::PluginNotFound { .. } => Self::NoPluginAvailable,
76            DomainError::InvalidPluginInstance { gts_id, reason } => {
77                Self::Internal(format!("invalid plugin instance '{gts_id}': {reason}"))
78            }
79            DomainError::PluginUnavailable { gts_id, reason } => {
80                Self::ServiceUnavailable(format!("plugin not available for '{gts_id}': {reason}"))
81            }
82            DomainError::TypesRegistryUnavailable(reason) | DomainError::Internal(reason) => {
83                Self::Internal(reason)
84            }
85        }
86    }
87}