1use thiserror::Error;
2
3#[derive(Error, Debug)]
5pub enum DiError {
6 #[error("Service not registered: {type_name}")]
8 ServiceNotRegistered { type_name: String },
9
10 #[error("Keyed service not registered: {type_name} with key '{key}'")]
12 KeyedServiceNotRegistered { type_name: String, key: String },
13
14 #[error("Circular dependency detected for service: {type_name}")]
16 CircularDependency { type_name: String },
17
18 #[error("Scope has been disposed")]
20 ScopeDisposed,
21
22 #[error("Failed to create service: {type_name} - {reason}")]
24 ServiceCreationFailed { type_name: String, reason: String },
25
26 #[error("Service already registered: {type_name}")]
28 ServiceAlreadyRegistered { type_name: String },
29
30 #[error("Type casting failed for service: {type_name}")]
32 TypeCastingFailed { type_name: String },
33
34 #[error("Scoped service '{type_name}' cannot be resolved from root container")]
36 ScopedServiceInRootContainer { type_name: String },
37
38 #[error("Generic error: {message}")]
40 Generic { message: String },
41}
42
43impl DiError {
44 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 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 pub fn circular_dependency<T: 'static>() -> Self {
61 Self::CircularDependency {
62 type_name: std::any::type_name::<T>().to_string(),
63 }
64 }
65
66 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 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 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 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 pub fn generic(message: &str) -> Self {
97 Self::Generic {
98 message: message.to_string(),
99 }
100 }
101}
102
103pub type DiResult<T> = Result<T, DiError>;