spikard 0.3.3 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/spikard_rb/Cargo.toml +1 -1
- data/lib/spikard/version.rb +1 -1
- data/vendor/crates/spikard-core/Cargo.toml +13 -13
- data/vendor/crates/spikard-http/Cargo.toml +31 -21
- data/vendor/crates/spikard-rb/Cargo.toml +1 -1
- metadata +1 -79
- data/vendor/spikard-core/Cargo.toml +0 -40
- data/vendor/spikard-core/src/bindings/mod.rs +0 -3
- data/vendor/spikard-core/src/bindings/response.rs +0 -133
- data/vendor/spikard-core/src/debug.rs +0 -63
- data/vendor/spikard-core/src/di/container.rs +0 -726
- data/vendor/spikard-core/src/di/dependency.rs +0 -273
- data/vendor/spikard-core/src/di/error.rs +0 -118
- data/vendor/spikard-core/src/di/factory.rs +0 -538
- data/vendor/spikard-core/src/di/graph.rs +0 -545
- data/vendor/spikard-core/src/di/mod.rs +0 -192
- data/vendor/spikard-core/src/di/resolved.rs +0 -411
- data/vendor/spikard-core/src/di/value.rs +0 -283
- data/vendor/spikard-core/src/http.rs +0 -153
- data/vendor/spikard-core/src/lib.rs +0 -28
- data/vendor/spikard-core/src/lifecycle.rs +0 -422
- data/vendor/spikard-core/src/parameters.rs +0 -719
- data/vendor/spikard-core/src/problem.rs +0 -310
- data/vendor/spikard-core/src/request_data.rs +0 -189
- data/vendor/spikard-core/src/router.rs +0 -249
- data/vendor/spikard-core/src/schema_registry.rs +0 -183
- data/vendor/spikard-core/src/type_hints.rs +0 -304
- data/vendor/spikard-core/src/validation.rs +0 -699
- data/vendor/spikard-http/Cargo.toml +0 -58
- data/vendor/spikard-http/src/auth.rs +0 -247
- data/vendor/spikard-http/src/background.rs +0 -249
- data/vendor/spikard-http/src/bindings/mod.rs +0 -3
- data/vendor/spikard-http/src/bindings/response.rs +0 -1
- data/vendor/spikard-http/src/body_metadata.rs +0 -8
- data/vendor/spikard-http/src/cors.rs +0 -490
- data/vendor/spikard-http/src/debug.rs +0 -63
- data/vendor/spikard-http/src/di_handler.rs +0 -423
- data/vendor/spikard-http/src/handler_response.rs +0 -190
- data/vendor/spikard-http/src/handler_trait.rs +0 -228
- data/vendor/spikard-http/src/handler_trait_tests.rs +0 -284
- data/vendor/spikard-http/src/lib.rs +0 -529
- data/vendor/spikard-http/src/lifecycle/adapter.rs +0 -149
- data/vendor/spikard-http/src/lifecycle.rs +0 -428
- data/vendor/spikard-http/src/middleware/mod.rs +0 -285
- data/vendor/spikard-http/src/middleware/multipart.rs +0 -86
- data/vendor/spikard-http/src/middleware/urlencoded.rs +0 -147
- data/vendor/spikard-http/src/middleware/validation.rs +0 -287
- data/vendor/spikard-http/src/openapi/mod.rs +0 -309
- data/vendor/spikard-http/src/openapi/parameter_extraction.rs +0 -190
- data/vendor/spikard-http/src/openapi/schema_conversion.rs +0 -308
- data/vendor/spikard-http/src/openapi/spec_generation.rs +0 -195
- data/vendor/spikard-http/src/parameters.rs +0 -1
- data/vendor/spikard-http/src/problem.rs +0 -1
- data/vendor/spikard-http/src/query_parser.rs +0 -369
- data/vendor/spikard-http/src/response.rs +0 -399
- data/vendor/spikard-http/src/router.rs +0 -1
- data/vendor/spikard-http/src/schema_registry.rs +0 -1
- data/vendor/spikard-http/src/server/handler.rs +0 -80
- data/vendor/spikard-http/src/server/lifecycle_execution.rs +0 -98
- data/vendor/spikard-http/src/server/mod.rs +0 -805
- data/vendor/spikard-http/src/server/request_extraction.rs +0 -119
- data/vendor/spikard-http/src/sse.rs +0 -447
- data/vendor/spikard-http/src/testing/form.rs +0 -14
- data/vendor/spikard-http/src/testing/multipart.rs +0 -60
- data/vendor/spikard-http/src/testing/test_client.rs +0 -285
- data/vendor/spikard-http/src/testing.rs +0 -377
- data/vendor/spikard-http/src/type_hints.rs +0 -1
- data/vendor/spikard-http/src/validation.rs +0 -1
- data/vendor/spikard-http/src/websocket.rs +0 -324
- data/vendor/spikard-rb/Cargo.toml +0 -42
- data/vendor/spikard-rb/build.rs +0 -8
- data/vendor/spikard-rb/src/background.rs +0 -63
- data/vendor/spikard-rb/src/config.rs +0 -294
- data/vendor/spikard-rb/src/conversion.rs +0 -392
- data/vendor/spikard-rb/src/di.rs +0 -409
- data/vendor/spikard-rb/src/handler.rs +0 -534
- data/vendor/spikard-rb/src/lib.rs +0 -2020
- data/vendor/spikard-rb/src/lifecycle.rs +0 -267
- data/vendor/spikard-rb/src/server.rs +0 -283
- data/vendor/spikard-rb/src/sse.rs +0 -231
- data/vendor/spikard-rb/src/test_client.rs +0 -404
- data/vendor/spikard-rb/src/test_sse.rs +0 -143
- data/vendor/spikard-rb/src/test_websocket.rs +0 -221
- data/vendor/spikard-rb/src/websocket.rs +0 -233
|
@@ -1,273 +0,0 @@
|
|
|
1
|
-
//! Core dependency trait
|
|
2
|
-
//!
|
|
3
|
-
//! This module defines the `Dependency` trait which all dependency implementations
|
|
4
|
-
//! must implement to integrate with the DI container.
|
|
5
|
-
|
|
6
|
-
use super::error::DependencyError;
|
|
7
|
-
use super::resolved::ResolvedDependencies;
|
|
8
|
-
use crate::request_data::RequestData;
|
|
9
|
-
use http::Request;
|
|
10
|
-
use std::any::Any;
|
|
11
|
-
use std::future::Future;
|
|
12
|
-
use std::pin::Pin;
|
|
13
|
-
use std::sync::Arc;
|
|
14
|
-
|
|
15
|
-
type BoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
|
|
16
|
-
|
|
17
|
-
/// Trait for all dependency implementations
|
|
18
|
-
///
|
|
19
|
-
/// This trait defines how dependencies are resolved within the DI container.
|
|
20
|
-
/// Implementations can be simple values, factories, or complex async providers.
|
|
21
|
-
///
|
|
22
|
-
/// # Type Erasure
|
|
23
|
-
///
|
|
24
|
-
/// Dependencies return `Arc<dyn Any + Send + Sync>` to support storing heterogeneous
|
|
25
|
-
/// types in the same container. Use `ResolvedDependencies::get<T>()` for type-safe access.
|
|
26
|
-
///
|
|
27
|
-
/// # Async Resolution
|
|
28
|
-
///
|
|
29
|
-
/// All dependencies resolve asynchronously, allowing for I/O operations like
|
|
30
|
-
/// database connections or HTTP requests during resolution.
|
|
31
|
-
///
|
|
32
|
-
/// # Caching Strategies
|
|
33
|
-
///
|
|
34
|
-
/// - **Singleton**: Resolved once globally, cached forever
|
|
35
|
-
/// - **Cacheable**: Resolved once per request, cached for that request
|
|
36
|
-
/// - **Factory**: Resolved every time it's requested
|
|
37
|
-
///
|
|
38
|
-
/// # Examples
|
|
39
|
-
///
|
|
40
|
-
/// ```ignore
|
|
41
|
-
/// use spikard_core::di::{Dependency, DependencyError, ResolvedDependencies};
|
|
42
|
-
/// use http::Request;
|
|
43
|
-
/// use crate::request_data::RequestData;
|
|
44
|
-
/// use std::any::Any;
|
|
45
|
-
/// use std::sync::Arc;
|
|
46
|
-
///
|
|
47
|
-
/// struct SimpleDependency {
|
|
48
|
-
/// key: String,
|
|
49
|
-
/// value: Arc<i32>,
|
|
50
|
-
/// }
|
|
51
|
-
///
|
|
52
|
-
/// impl Dependency for SimpleDependency {
|
|
53
|
-
/// fn resolve(
|
|
54
|
-
/// &self,
|
|
55
|
-
/// _request: &Request<()>,
|
|
56
|
-
/// _request_data: &RequestData,
|
|
57
|
-
/// _resolved: &ResolvedDependencies,
|
|
58
|
-
/// ) -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<Arc<dyn Any + Send + Sync>, DependencyError>> + Send>> {
|
|
59
|
-
/// let value = self.value.clone();
|
|
60
|
-
/// Box::pin(async move {
|
|
61
|
-
/// Ok(value as Arc<dyn Any + Send + Sync>)
|
|
62
|
-
/// })
|
|
63
|
-
/// }
|
|
64
|
-
///
|
|
65
|
-
/// fn key(&self) -> &str {
|
|
66
|
-
/// &self.key
|
|
67
|
-
/// }
|
|
68
|
-
///
|
|
69
|
-
/// fn depends_on(&self) -> Vec<String> {
|
|
70
|
-
/// vec![]
|
|
71
|
-
/// }
|
|
72
|
-
/// }
|
|
73
|
-
/// ```
|
|
74
|
-
pub trait Dependency: Send + Sync {
|
|
75
|
-
/// Resolve this dependency to a concrete value
|
|
76
|
-
///
|
|
77
|
-
/// This method is called by the DI container to obtain the actual dependency value.
|
|
78
|
-
/// It can perform async operations, access request data, and retrieve other
|
|
79
|
-
/// already-resolved dependencies.
|
|
80
|
-
///
|
|
81
|
-
/// # Arguments
|
|
82
|
-
///
|
|
83
|
-
/// * `request` - The HTTP request being handled
|
|
84
|
-
/// * `request_data` - Extracted request data (params, headers, body, etc.)
|
|
85
|
-
/// * `resolved` - Already-resolved dependencies that this dependency may need
|
|
86
|
-
///
|
|
87
|
-
/// # Returns
|
|
88
|
-
///
|
|
89
|
-
/// A future that resolves to either:
|
|
90
|
-
/// - `Ok(Arc<dyn Any + Send + Sync>)` - The resolved dependency value
|
|
91
|
-
/// - `Err(DependencyError)` - An error during resolution
|
|
92
|
-
///
|
|
93
|
-
/// # Examples
|
|
94
|
-
///
|
|
95
|
-
/// ```ignore
|
|
96
|
-
/// use spikard_core::di::{Dependency, DependencyError, ResolvedDependencies};
|
|
97
|
-
/// use http::Request;
|
|
98
|
-
/// use crate::request_data::RequestData;
|
|
99
|
-
/// use std::any::Any;
|
|
100
|
-
/// use std::sync::Arc;
|
|
101
|
-
///
|
|
102
|
-
/// struct ConfigDependency;
|
|
103
|
-
///
|
|
104
|
-
/// impl Dependency for ConfigDependency {
|
|
105
|
-
/// fn resolve(
|
|
106
|
-
/// &self,
|
|
107
|
-
/// _request: &Request<()>,
|
|
108
|
-
/// request_data: &RequestData,
|
|
109
|
-
/// _resolved: &ResolvedDependencies,
|
|
110
|
-
/// ) -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<Arc<dyn Any + Send + Sync>, DependencyError>> + Send>> {
|
|
111
|
-
/// // Access request data to determine config
|
|
112
|
-
/// let env = request_data.headers
|
|
113
|
-
/// .get("X-Environment")
|
|
114
|
-
/// .map(|s| s.as_str())
|
|
115
|
-
/// .unwrap_or("production");
|
|
116
|
-
///
|
|
117
|
-
/// let config = format!("Config for {}", env);
|
|
118
|
-
/// Box::pin(async move {
|
|
119
|
-
/// Ok(Arc::new(config) as Arc<dyn Any + Send + Sync>)
|
|
120
|
-
/// })
|
|
121
|
-
/// }
|
|
122
|
-
///
|
|
123
|
-
/// fn key(&self) -> &str {
|
|
124
|
-
/// "config"
|
|
125
|
-
/// }
|
|
126
|
-
///
|
|
127
|
-
/// fn depends_on(&self) -> Vec<String> {
|
|
128
|
-
/// vec![]
|
|
129
|
-
/// }
|
|
130
|
-
/// }
|
|
131
|
-
/// ```
|
|
132
|
-
fn resolve(
|
|
133
|
-
&self,
|
|
134
|
-
request: &Request<()>,
|
|
135
|
-
request_data: &RequestData,
|
|
136
|
-
resolved: &ResolvedDependencies,
|
|
137
|
-
) -> BoxFuture<'_, Result<Arc<dyn Any + Send + Sync>, DependencyError>>;
|
|
138
|
-
|
|
139
|
-
/// Get the unique key for this dependency
|
|
140
|
-
///
|
|
141
|
-
/// This key is used to identify the dependency in the container and
|
|
142
|
-
/// when other dependencies reference it.
|
|
143
|
-
///
|
|
144
|
-
/// # Examples
|
|
145
|
-
///
|
|
146
|
-
/// ```ignore
|
|
147
|
-
/// use spikard_core::di::Dependency;
|
|
148
|
-
/// # use spikard_core::di::{DependencyError, ResolvedDependencies};
|
|
149
|
-
/// # use http::Request;
|
|
150
|
-
/// # use crate::request_data::RequestData;
|
|
151
|
-
/// # use std::any::Any;
|
|
152
|
-
/// # use std::sync::Arc;
|
|
153
|
-
///
|
|
154
|
-
/// # struct MyDependency { key: String }
|
|
155
|
-
/// # impl Dependency for MyDependency {
|
|
156
|
-
/// # fn resolve(&self, _: &Request<()>, _: &RequestData, _: &ResolvedDependencies)
|
|
157
|
-
/// # -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<Arc<dyn Any + Send + Sync>, DependencyError>> + Send>>
|
|
158
|
-
/// # { Box::pin(async { Ok(Arc::new(()) as Arc<dyn Any + Send + Sync>) }) }
|
|
159
|
-
/// fn key(&self) -> &str {
|
|
160
|
-
/// &self.key
|
|
161
|
-
/// }
|
|
162
|
-
/// # fn depends_on(&self) -> Vec<String> { vec![] }
|
|
163
|
-
/// # }
|
|
164
|
-
/// ```
|
|
165
|
-
fn key(&self) -> &str;
|
|
166
|
-
|
|
167
|
-
/// Get the list of dependency keys that this dependency requires
|
|
168
|
-
///
|
|
169
|
-
/// These dependencies will be resolved before this one, and will be
|
|
170
|
-
/// available in the `resolved` parameter passed to `resolve()`.
|
|
171
|
-
///
|
|
172
|
-
/// # Returns
|
|
173
|
-
///
|
|
174
|
-
/// A vector of dependency keys that must be resolved first
|
|
175
|
-
///
|
|
176
|
-
/// # Examples
|
|
177
|
-
///
|
|
178
|
-
/// ```ignore
|
|
179
|
-
/// use spikard_core::di::Dependency;
|
|
180
|
-
/// # use spikard_core::di::{DependencyError, ResolvedDependencies};
|
|
181
|
-
/// # use http::Request;
|
|
182
|
-
/// # use crate::request_data::RequestData;
|
|
183
|
-
/// # use std::any::Any;
|
|
184
|
-
/// # use std::sync::Arc;
|
|
185
|
-
///
|
|
186
|
-
/// # struct MyDependency;
|
|
187
|
-
/// # impl Dependency for MyDependency {
|
|
188
|
-
/// # fn resolve(&self, _: &Request<()>, _: &RequestData, _: &ResolvedDependencies)
|
|
189
|
-
/// # -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<Arc<dyn Any + Send + Sync>, DependencyError>> + Send>>
|
|
190
|
-
/// # { Box::pin(async { Ok(Arc::new(()) as Arc<dyn Any + Send + Sync>) }) }
|
|
191
|
-
/// # fn key(&self) -> &str { "service" }
|
|
192
|
-
/// fn depends_on(&self) -> Vec<String> {
|
|
193
|
-
/// vec!["database".to_string(), "cache".to_string()]
|
|
194
|
-
/// }
|
|
195
|
-
/// # }
|
|
196
|
-
/// ```
|
|
197
|
-
fn depends_on(&self) -> Vec<String>;
|
|
198
|
-
|
|
199
|
-
/// Whether this dependency's value can be cached within a single request
|
|
200
|
-
///
|
|
201
|
-
/// If `true`, the dependency will be resolved once per request and the
|
|
202
|
-
/// same value will be reused for all handlers in that request.
|
|
203
|
-
///
|
|
204
|
-
/// If `false`, the dependency will be resolved every time it's requested.
|
|
205
|
-
///
|
|
206
|
-
/// # Default
|
|
207
|
-
///
|
|
208
|
-
/// Returns `false` by default (no caching).
|
|
209
|
-
///
|
|
210
|
-
/// # Examples
|
|
211
|
-
///
|
|
212
|
-
/// ```ignore
|
|
213
|
-
/// use spikard_core::di::Dependency;
|
|
214
|
-
/// # use spikard_core::di::{DependencyError, ResolvedDependencies};
|
|
215
|
-
/// # use http::Request;
|
|
216
|
-
/// # use crate::request_data::RequestData;
|
|
217
|
-
/// # use std::any::Any;
|
|
218
|
-
/// # use std::sync::Arc;
|
|
219
|
-
///
|
|
220
|
-
/// # struct MyDependency;
|
|
221
|
-
/// # impl Dependency for MyDependency {
|
|
222
|
-
/// # fn resolve(&self, _: &Request<()>, _: &RequestData, _: &ResolvedDependencies)
|
|
223
|
-
/// # -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<Arc<dyn Any + Send + Sync>, DependencyError>> + Send>>
|
|
224
|
-
/// # { Box::pin(async { Ok(Arc::new(()) as Arc<dyn Any + Send + Sync>) }) }
|
|
225
|
-
/// # fn key(&self) -> &str { "request_id" }
|
|
226
|
-
/// # fn depends_on(&self) -> Vec<String> { vec![] }
|
|
227
|
-
/// fn cacheable(&self) -> bool {
|
|
228
|
-
/// true // Cache within the request
|
|
229
|
-
/// }
|
|
230
|
-
/// # }
|
|
231
|
-
/// ```
|
|
232
|
-
fn cacheable(&self) -> bool {
|
|
233
|
-
false
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
/// Whether this dependency is a singleton (cached globally across all requests)
|
|
237
|
-
///
|
|
238
|
-
/// If `true`, the dependency will be resolved once globally and the same
|
|
239
|
-
/// value will be reused for all requests.
|
|
240
|
-
///
|
|
241
|
-
/// If `false`, the dependency will be resolved per-request (if cacheable)
|
|
242
|
-
/// or per-use (if not cacheable).
|
|
243
|
-
///
|
|
244
|
-
/// # Default
|
|
245
|
-
///
|
|
246
|
-
/// Returns `false` by default (not a singleton).
|
|
247
|
-
///
|
|
248
|
-
/// # Examples
|
|
249
|
-
///
|
|
250
|
-
/// ```ignore
|
|
251
|
-
/// use spikard_core::di::Dependency;
|
|
252
|
-
/// # use spikard_core::di::{DependencyError, ResolvedDependencies};
|
|
253
|
-
/// # use http::Request;
|
|
254
|
-
/// # use crate::request_data::RequestData;
|
|
255
|
-
/// # use std::any::Any;
|
|
256
|
-
/// # use std::sync::Arc;
|
|
257
|
-
///
|
|
258
|
-
/// # struct MyDependency;
|
|
259
|
-
/// # impl Dependency for MyDependency {
|
|
260
|
-
/// # fn resolve(&self, _: &Request<()>, _: &RequestData, _: &ResolvedDependencies)
|
|
261
|
-
/// # -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<Arc<dyn Any + Send + Sync>, DependencyError>> + Send>>
|
|
262
|
-
/// # { Box::pin(async { Ok(Arc::new(()) as Arc<dyn Any + Send + Sync>) }) }
|
|
263
|
-
/// # fn key(&self) -> &str { "database_pool" }
|
|
264
|
-
/// # fn depends_on(&self) -> Vec<String> { vec![] }
|
|
265
|
-
/// fn singleton(&self) -> bool {
|
|
266
|
-
/// true // Resolve once globally
|
|
267
|
-
/// }
|
|
268
|
-
/// # }
|
|
269
|
-
/// ```
|
|
270
|
-
fn singleton(&self) -> bool {
|
|
271
|
-
false
|
|
272
|
-
}
|
|
273
|
-
}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
//! Dependency injection error types
|
|
2
|
-
//!
|
|
3
|
-
//! This module defines all error types that can occur during dependency registration
|
|
4
|
-
//! and resolution in the DI container.
|
|
5
|
-
|
|
6
|
-
/// Errors that can occur during dependency injection operations
|
|
7
|
-
///
|
|
8
|
-
/// # Examples
|
|
9
|
-
///
|
|
10
|
-
/// ```ignore
|
|
11
|
-
/// use spikard_core::di::DependencyError;
|
|
12
|
-
///
|
|
13
|
-
/// let error = DependencyError::NotFound {
|
|
14
|
-
/// key: "database".to_string(),
|
|
15
|
-
/// };
|
|
16
|
-
/// assert_eq!(error.to_string(), "Dependency not found: database");
|
|
17
|
-
/// ```
|
|
18
|
-
#[derive(thiserror::Error, Debug)]
|
|
19
|
-
pub enum DependencyError {
|
|
20
|
-
/// A circular dependency was detected during registration or resolution
|
|
21
|
-
///
|
|
22
|
-
/// Contains the cycle as a vector of dependency keys in the order they were encountered.
|
|
23
|
-
///
|
|
24
|
-
/// # Example
|
|
25
|
-
///
|
|
26
|
-
/// ```ignore
|
|
27
|
-
/// use spikard_core::di::DependencyError;
|
|
28
|
-
///
|
|
29
|
-
/// let error = DependencyError::CircularDependency {
|
|
30
|
-
/// cycle: vec!["A".to_string(), "B".to_string(), "A".to_string()],
|
|
31
|
-
/// };
|
|
32
|
-
/// println!("{}", error); // "Circular dependency detected: ["A", "B", "A"]"
|
|
33
|
-
/// ```
|
|
34
|
-
#[error("Circular dependency detected: {cycle:?}")]
|
|
35
|
-
CircularDependency {
|
|
36
|
-
/// The cycle of dependencies (e.g., ["A", "B", "C", "A"])
|
|
37
|
-
cycle: Vec<String>,
|
|
38
|
-
},
|
|
39
|
-
|
|
40
|
-
/// A requested dependency was not found in the container
|
|
41
|
-
///
|
|
42
|
-
/// # Example
|
|
43
|
-
///
|
|
44
|
-
/// ```ignore
|
|
45
|
-
/// use spikard_core::di::DependencyError;
|
|
46
|
-
///
|
|
47
|
-
/// let error = DependencyError::NotFound {
|
|
48
|
-
/// key: "cache".to_string(),
|
|
49
|
-
/// };
|
|
50
|
-
/// assert!(error.to_string().contains("cache"));
|
|
51
|
-
/// ```
|
|
52
|
-
#[error("Dependency not found: {key}")]
|
|
53
|
-
NotFound {
|
|
54
|
-
/// The key of the missing dependency
|
|
55
|
-
key: String,
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
/// Type mismatch when attempting to downcast a dependency to a concrete type
|
|
59
|
-
///
|
|
60
|
-
/// This occurs when calling `ResolvedDependencies::get<T>()` with the wrong type.
|
|
61
|
-
///
|
|
62
|
-
/// # Example
|
|
63
|
-
///
|
|
64
|
-
/// ```ignore
|
|
65
|
-
/// use spikard_core::di::DependencyError;
|
|
66
|
-
///
|
|
67
|
-
/// let error = DependencyError::TypeMismatch {
|
|
68
|
-
/// key: "config".to_string(),
|
|
69
|
-
/// };
|
|
70
|
-
/// println!("{}", error); // "Type mismatch for dependency: config"
|
|
71
|
-
/// ```
|
|
72
|
-
#[error("Type mismatch for dependency: {key}")]
|
|
73
|
-
TypeMismatch {
|
|
74
|
-
/// The key of the dependency with the type mismatch
|
|
75
|
-
key: String,
|
|
76
|
-
},
|
|
77
|
-
|
|
78
|
-
/// A dependency failed to resolve
|
|
79
|
-
///
|
|
80
|
-
/// This is a catch-all for any errors that occur during the resolution process,
|
|
81
|
-
/// such as factory function failures or async resolution errors.
|
|
82
|
-
///
|
|
83
|
-
/// # Example
|
|
84
|
-
///
|
|
85
|
-
/// ```ignore
|
|
86
|
-
/// use spikard_core::di::DependencyError;
|
|
87
|
-
///
|
|
88
|
-
/// let error = DependencyError::ResolutionFailed {
|
|
89
|
-
/// message: "Database connection failed".to_string(),
|
|
90
|
-
/// };
|
|
91
|
-
/// assert!(error.to_string().contains("Database connection"));
|
|
92
|
-
/// ```
|
|
93
|
-
#[error("Resolution failed: {message}")]
|
|
94
|
-
ResolutionFailed {
|
|
95
|
-
/// Description of the resolution failure
|
|
96
|
-
message: String,
|
|
97
|
-
},
|
|
98
|
-
|
|
99
|
-
/// A duplicate dependency key was registered
|
|
100
|
-
///
|
|
101
|
-
/// The DI container does not allow multiple dependencies with the same key.
|
|
102
|
-
///
|
|
103
|
-
/// # Example
|
|
104
|
-
///
|
|
105
|
-
/// ```ignore
|
|
106
|
-
/// use spikard_core::di::DependencyError;
|
|
107
|
-
///
|
|
108
|
-
/// let error = DependencyError::DuplicateKey {
|
|
109
|
-
/// key: "logger".to_string(),
|
|
110
|
-
/// };
|
|
111
|
-
/// println!("{}", error); // "Duplicate dependency key: logger"
|
|
112
|
-
/// ```
|
|
113
|
-
#[error("Duplicate dependency key: {key}")]
|
|
114
|
-
DuplicateKey {
|
|
115
|
-
/// The duplicate key
|
|
116
|
-
key: String,
|
|
117
|
-
},
|
|
118
|
-
}
|