task_supervisor/supervisor/
builder.rs1use std::{collections::HashMap, time::Duration};
2
3use tokio::sync::mpsc;
4
5use crate::{
6 task::{CloneableSupervisedTask, TaskHandle},
7 Supervisor,
8};
9
10pub struct SupervisorBuilder {
15 tasks: HashMap<String, TaskHandle>,
16 health_check_interval: Duration,
17 max_restart_attempts: u32,
18 base_restart_delay: Duration,
19 task_stable_after_delay: Duration,
20 max_dead_tasks_percentage_threshold: Option<f64>,
21}
22
23impl SupervisorBuilder {
24 pub fn new() -> Self {
26 Self {
27 tasks: HashMap::new(),
28 health_check_interval: Duration::from_millis(200),
29 max_restart_attempts: 5,
30 base_restart_delay: Duration::from_secs(1),
31 task_stable_after_delay: Duration::from_secs(80),
32 max_dead_tasks_percentage_threshold: None,
33 }
34 }
35
36 pub fn with_task(mut self, name: &str, task: impl CloneableSupervisedTask) -> Self {
38 let handle =
39 TaskHandle::from_task(task, self.max_restart_attempts, self.base_restart_delay);
40 self.tasks.insert(name.into(), handle);
41 self
42 }
43
44 pub fn with_health_check_interval(mut self, interval: Duration) -> Self {
46 self.health_check_interval = interval;
47 self
48 }
49
50 pub fn with_max_restart_attempts(mut self, attempts: u32) -> Self {
52 self.max_restart_attempts = attempts;
53 self
54 }
55
56 pub fn with_base_restart_delay(mut self, delay: Duration) -> Self {
58 self.base_restart_delay = delay;
59 self
60 }
61
62 pub fn with_task_being_stable_after(mut self, delay: Duration) -> Self {
65 self.task_stable_after_delay = delay;
66 self
67 }
68
69 pub fn with_dead_tasks_threshold(mut self, threshold_percentage: Option<f64>) -> Self {
75 self.max_dead_tasks_percentage_threshold = threshold_percentage.map(|t| t.clamp(0.0, 1.0));
76 self
77 }
78
79 pub fn build(self) -> Supervisor {
81 let (internal_tx, internal_rx) = mpsc::unbounded_channel();
82 let (user_tx, user_rx) = mpsc::unbounded_channel();
83 Supervisor {
84 tasks: self.tasks,
85 health_check_interval: self.health_check_interval,
86 base_restart_delay: self.base_restart_delay,
87 max_restart_attempts: self.max_restart_attempts,
88 task_is_stable_after: self.task_stable_after_delay,
89 max_dead_tasks_percentage_threshold: self.max_dead_tasks_percentage_threshold,
90 internal_tx,
91 internal_rx,
92 external_tx: user_tx,
93 external_rx: user_rx,
94 }
95 }
96}
97
98impl Default for SupervisorBuilder {
99 fn default() -> Self {
100 Self::new()
101 }
102}