rust_supervisor/runtime/
supervisor.rs1use crate::control::handle::SupervisorHandle;
7use crate::error::types::SupervisorError;
8use crate::runtime::control_loop::{RuntimeControlState, run_control_loop};
9use crate::shutdown::stage::ShutdownPolicy;
10use crate::spec::supervisor::SupervisorSpec;
11use tokio::sync::{broadcast, mpsc};
12
13#[derive(Debug, Clone, Copy, Default)]
15pub struct Supervisor;
16
17impl Supervisor {
18 pub async fn start(spec: SupervisorSpec) -> Result<SupervisorHandle, SupervisorError> {
28 let shutdown_policy = shutdown_policy_from_spec(&spec);
29 Self::start_with_policy(spec, shutdown_policy).await
30 }
31
32 pub async fn start_with_policy(
43 spec: SupervisorSpec,
44 shutdown_policy: ShutdownPolicy,
45 ) -> Result<SupervisorHandle, SupervisorError> {
46 spec.validate()?;
47 let (command_sender, command_receiver) = mpsc::channel(spec.control_channel_capacity);
48 let (event_sender, _) = broadcast::channel(spec.event_channel_capacity);
49 let state = RuntimeControlState::new(spec, shutdown_policy, command_sender.clone())?;
50 tokio::spawn(run_control_loop(
51 state,
52 command_receiver,
53 event_sender.clone(),
54 ));
55 Ok(SupervisorHandle::new(command_sender, event_sender))
56 }
57}
58
59fn shutdown_policy_from_spec(spec: &SupervisorSpec) -> ShutdownPolicy {
69 ShutdownPolicy::new(
70 spec.default_shutdown_policy.graceful_timeout,
71 spec.default_shutdown_policy.abort_wait,
72 true,
73 )
74}