flow_di/
errors.rs

1use thiserror::Error;
2
3/// Error types for the dependency injection framework
4#[derive(Error, Debug)]
5pub enum DiError {
6    /// Service not registered
7    #[error("Service not registered: {type_name}")]
8    ServiceNotRegistered { type_name: String },
9
10    /// Keyed service not registered
11    #[error("Keyed service not registered: {type_name} with key '{key}'")]
12    KeyedServiceNotRegistered { type_name: String, key: String },
13
14    /// Circular dependency detected
15    #[error("Circular dependency detected for service: {type_name}")]
16    CircularDependency { type_name: String },
17
18    /// Scope has been disposed
19    #[error("Scope has been disposed")]
20    ScopeDisposed,
21
22    /// Service creation failed
23    #[error("Failed to create service: {type_name} - {reason}")]
24    ServiceCreationFailed { type_name: String, reason: String },
25
26    /// Service already registered
27    #[error("Service already registered: {type_name}")]
28    ServiceAlreadyRegistered { type_name: String },
29
30    /// Type casting failed
31    #[error("Type casting failed for service: {type_name}")]
32    TypeCastingFailed { type_name: String },
33
34    /// Scoped service resolved from root container
35    #[error("Scoped service '{type_name}' cannot be resolved from root container")]
36    ScopedServiceInRootContainer { type_name: String },
37
38    /// Generic error
39    #[error("Generic error: {message}")]
40    Generic { message: String },
41}
42
43impl DiError {
44    /// Create service not registered error from TypeId
45    pub fn service_not_registered<T: 'static>() -> Self {
46        Self::ServiceNotRegistered {
47            type_name: std::any::type_name::<T>().to_string(),
48        }
49    }
50
51    /// Create keyed service not registered error from TypeId
52    pub fn keyed_service_not_registered<T: 'static>(key: &str) -> Self {
53        Self::KeyedServiceNotRegistered {
54            type_name: std::any::type_name::<T>().to_string(),
55            key: key.to_string(),
56        }
57    }
58
59    /// Create circular dependency error from TypeId
60    pub fn circular_dependency<T: 'static>() -> Self {
61        Self::CircularDependency {
62            type_name: std::any::type_name::<T>().to_string(),
63        }
64    }
65
66    /// Create service creation failed error from TypeId
67    pub fn service_creation_failed<T: 'static>(reason: &str) -> Self {
68        Self::ServiceCreationFailed {
69            type_name: std::any::type_name::<T>().to_string(),
70            reason: reason.to_string(),
71        }
72    }
73
74    /// Create service already registered error from TypeId
75    pub fn service_already_registered<T: 'static>() -> Self {
76        Self::ServiceAlreadyRegistered {
77            type_name: std::any::type_name::<T>().to_string(),
78        }
79    }
80
81    /// Create type casting failed error from TypeId
82    pub fn type_casting_failed<T: 'static>() -> Self {
83        Self::TypeCastingFailed {
84            type_name: std::any::type_name::<T>().to_string(),
85        }
86    }
87
88    /// Create scoped service in root container error from TypeId
89    pub fn scoped_service_in_root_container<T: 'static>() -> Self {
90        Self::ScopedServiceInRootContainer {
91            type_name: std::any::type_name::<T>().to_string(),
92        }
93    }
94
95    /// Create generic error
96    pub fn generic(message: &str) -> Self {
97        Self::Generic {
98            message: message.to_string(),
99        }
100    }
101}
102
103/// Dependency injection result type
104pub type DiResult<T> = Result<T, DiError>;