1use crate::health_check::Health;
10
11pub type ServiceID = String;
13
14#[derive(Debug)]
16pub enum State {
17 Pending,
19 Starting,
21 Running { health: Option<Health> },
23 Disabled,
25 Exited { exit_code: i32 },
27 Killed,
29}
30
31impl std::fmt::Display for State {
32 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33 match self {
34 Self::Pending => write!(f, "Pending"),
35 Self::Starting => write!(f, "Starting"),
36 Self::Running { health: None } => write!(f, "Running"),
37 Self::Running {
38 health: Some(health),
39 } => write!(f, "Running({health})"),
40 Self::Disabled => write!(f, "Disabled"),
41 Self::Exited { exit_code } => write!(f, "Exited({exit_code})"),
42 Self::Killed => write!(f, "Killed"),
43 }
44 }
45}
46
47#[derive(Debug)]
52pub enum Event {
53 Started {
55 service_id: ServiceID,
57 },
58 LogLine {
60 service_id: ServiceID,
62 stream: OutputStream,
64 update: LogUpdateKind,
66 line: String,
68 },
69 HealthCheckStarted {
71 service_id: ServiceID,
73 attempt: u64,
75 command: String,
77 },
78 HealthCheckLogLine {
80 service_id: ServiceID,
82 attempt: u64,
84 stream: OutputStream,
86 line: String,
88 },
89 HealthCheckFinished {
91 service_id: ServiceID,
93 attempt: u64,
95 success: bool,
97 exit_code: i32,
99 },
100 Killed(ServiceID),
102 Exited(ServiceID, i32),
104 Healthy(ServiceID),
106 Unhealthy(ServiceID),
108 Disabled(ServiceID),
110 ClearLogs(ServiceID),
112}
113
114#[derive(Debug, Clone, Copy, PartialEq, Eq)]
116pub enum LogUpdateKind {
117 Append,
119 ReplaceLast,
121}
122
123#[derive(Debug, Clone, Copy, PartialEq, Eq)]
125pub enum OutputStream {
126 Stdout,
128 Stderr,
130}
131
132impl Event {
133 #[must_use]
135 pub fn service_id(&self) -> &ServiceID {
136 match self {
137 Self::Started { service_id }
138 | Self::LogLine { service_id, .. }
139 | Self::HealthCheckStarted { service_id, .. }
140 | Self::HealthCheckLogLine { service_id, .. }
141 | Self::HealthCheckFinished { service_id, .. }
142 | Self::Killed(service_id)
143 | Self::Exited(service_id, _)
144 | Self::Healthy(service_id)
145 | Self::Unhealthy(service_id)
146 | Self::Disabled(service_id)
147 | Self::ClearLogs(service_id) => service_id,
148 }
149 }
150}
151
152impl std::fmt::Display for Event {
153 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
154 match self {
155 Self::Started { service_id, .. } => write!(f, "Started({service_id})"),
156 Self::LogLine {
157 service_id, stream, ..
158 } => write!(f, "LogLine({service_id}, {stream:?})"),
159 Self::HealthCheckStarted {
160 service_id,
161 attempt,
162 ..
163 } => write!(f, "HealthCheckStarted({service_id}, attempt={attempt})"),
164 Self::HealthCheckLogLine {
165 service_id,
166 stream,
167 attempt,
168 ..
169 } => write!(
170 f,
171 "HealthCheckLogLine({service_id}, {stream:?}, attempt={attempt})"
172 ),
173 Self::HealthCheckFinished {
174 service_id,
175 attempt,
176 success,
177 exit_code,
178 } => write!(
179 f,
180 "HealthCheckFinished({service_id}, attempt={attempt}, success={success}, exit_code={exit_code})"
181 ),
182 Self::Killed(service_id) => write!(f, "Killed({service_id})"),
183 Self::Exited(service_id, _) => write!(f, "Exited({service_id})"),
184 Self::Healthy(service_id) => write!(f, "Healthy({service_id})"),
185 Self::Unhealthy(service_id) => write!(f, "Unhealthy({service_id})"),
186 Self::Disabled(service_id) => write!(f, "Disabled({service_id})"),
187 Self::ClearLogs(service_id) => write!(f, "ClearLogs({service_id})"),
188 }
189 }
190}
191
192#[derive(Debug, Clone)]
194pub enum Command {
195 Restart(ServiceID),
197 RestartAll,
199 Disable(ServiceID),
201 Enable(ServiceID),
203 SendInput(ServiceID, Vec<u8>),
205 ResizeAll {
207 cols: u16,
209 rows: u16,
211 },
212}