1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//! Lifecycle options for bootstrap and shutdown.
//!
//! Enable the `lifecycle` feature for timeout support.
use Duration;
/// Options for application bootstrap.
///
/// Use with [`Application::bootstrap_with_options`](super::Application::bootstrap_with_options).
///
/// # Timeout
///
/// When the `lifecycle` feature is enabled, `timeout` limits how long the bootstrap
/// may take. If exceeded, an error is returned.
///
/// # Parallel Start
///
/// When `parallel_start` is `true`, module `on_start` hooks run concurrently.
/// Failures are aggregated into a single error.
///
/// # Examples
///
/// With timeout:
///
/// ```
/// use std::time::Duration;
/// use fluxdi::application::{Application, BootstrapOptions};
/// use fluxdi::{Injector, Module};
///
/// struct AppModule;
/// impl Module for AppModule {
/// fn providers(&self, _: &Injector) {}
/// }
///
/// #[tokio::main]
/// async fn main() -> Result<(), Box<dyn std::error::Error>> {
/// let mut app = Application::new(AppModule);
/// let opts = BootstrapOptions::default()
/// .with_timeout(Duration::from_secs(30));
/// app.bootstrap_with_options(opts).await?;
/// Ok(())
/// }
/// ```
///
/// With parallel module startup:
///
/// ```
/// use fluxdi::application::{Application, BootstrapOptions};
/// use fluxdi::{Injector, Module};
///
/// struct AppModule;
/// impl Module for AppModule {
/// fn providers(&self, _: &Injector) {}
/// }
///
/// #[tokio::main]
/// async fn main() -> Result<(), Box<dyn std::error::Error>> {
/// let mut app = Application::new(AppModule);
/// let opts = BootstrapOptions::default().with_parallel_start(true);
/// app.bootstrap_with_options(opts).await?;
/// Ok(())
/// }
/// ```
/// Options for application shutdown.
///
/// Use with [`Application::shutdown_with_options`](super::Application::shutdown_with_options).
///
/// # Timeout
///
/// When the `lifecycle` feature is enabled, `timeout` limits how long the shutdown
/// may take. If exceeded, an error is returned.
///
/// # Examples
///
/// ```
/// use std::time::Duration;
/// use fluxdi::application::{Application, ShutdownOptions};
/// use fluxdi::{Injector, Module};
///
/// struct AppModule;
/// impl Module for AppModule {
/// fn providers(&self, _: &Injector) {}
/// }
///
/// #[tokio::main]
/// async fn main() -> Result<(), Box<dyn std::error::Error>> {
/// let mut app = Application::new(AppModule);
/// app.bootstrap().await?;
///
/// let opts = ShutdownOptions::default()
/// .with_timeout(Duration::from_secs(10));
/// app.shutdown_with_options(opts).await?;
/// Ok(())
/// }
/// ```