appcore_supervisor/
error.rs1use std::fmt::{Display, Formatter};
14
15pub type SupervisorResult<T> = Result<T, SupervisorError>;
17
18#[derive(Debug, Clone, PartialEq, Eq)]
20pub enum SupervisorError {
21 InvalidConfiguration(String),
23 ServiceAlreadyRegistered(String),
25 ServiceNotFound(String),
27 DependencyNotFound {
29 service: String,
31 dependency: String,
33 },
34 DependencyCycle(Vec<String>),
36 DependencyUnavailable {
38 service: String,
40 dependency: String,
42 },
43 ServiceFailure {
45 service: String,
47 reason: String,
49 },
50 ShutdownTimeout(String),
52 ServiceOrphaned(String),
54 RestartBudgetExceeded(String),
56 RestartQueueFull,
58 RestartExecutorStopped,
60 StatePoisoned,
62}
63
64impl Display for SupervisorError {
65 fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
66 match self {
67 Self::InvalidConfiguration(reason) => {
68 write!(formatter, "invalid supervisor configuration: {reason}")
69 }
70 Self::ServiceAlreadyRegistered(service) => {
71 write!(formatter, "service `{service}` is already registered")
72 }
73 Self::ServiceNotFound(service) => {
74 write!(formatter, "service `{service}` is not registered")
75 }
76 Self::DependencyNotFound {
77 service,
78 dependency,
79 } => write!(
80 formatter,
81 "service `{service}` requires missing dependency `{dependency}`"
82 ),
83 Self::DependencyCycle(cycle) => {
84 write!(
85 formatter,
86 "service dependency cycle: {}",
87 cycle.join(" -> ")
88 )
89 }
90 Self::DependencyUnavailable {
91 service,
92 dependency,
93 } => write!(
94 formatter,
95 "service `{service}` dependency `{dependency}` is unavailable"
96 ),
97 Self::ServiceFailure { service, reason } => {
98 write!(formatter, "service `{service}` failed: {reason}")
99 }
100 Self::ShutdownTimeout(service) => {
101 write!(
102 formatter,
103 "service `{service}` exceeded its shutdown timeout"
104 )
105 }
106 Self::ServiceOrphaned(service) => {
107 write!(
108 formatter,
109 "service `{service}` has an orphaned instance and cannot start"
110 )
111 }
112 Self::RestartBudgetExceeded(service) => {
113 write!(
114 formatter,
115 "service `{service}` exhausted its restart budget"
116 )
117 }
118 Self::RestartQueueFull => formatter.write_str("restart executor queue is full"),
119 Self::RestartExecutorStopped => formatter.write_str("restart executor is unavailable"),
120 Self::StatePoisoned => formatter.write_str("supervisor state is poisoned"),
121 }
122 }
123}
124
125impl std::error::Error for SupervisorError {}