1use crate::{CamelError, MetricsCollector};
2use async_trait::async_trait;
3use serde::{Deserialize, Serialize};
4use std::sync::Arc;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
8pub enum ServiceStatus {
9 Stopped,
10 Started,
11 Failed,
12}
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
16pub enum HealthStatus {
17 Healthy,
18 Unhealthy,
19}
20
21#[async_trait]
37pub trait Lifecycle: Send + Sync {
38 fn name(&self) -> &str;
40
41 async fn start(&mut self) -> Result<(), CamelError>;
43
44 async fn stop(&mut self) -> Result<(), CamelError>;
46
47 fn as_metrics_collector(&self) -> Option<Arc<dyn MetricsCollector>> {
49 None
50 }
51
52 fn status(&self) -> ServiceStatus {
54 ServiceStatus::Stopped
55 }
56}
57
58#[cfg(test)]
59mod tests {
60 use super::*;
61
62 struct TestService;
63
64 #[async_trait]
65 impl Lifecycle for TestService {
66 fn name(&self) -> &str {
67 "test"
68 }
69
70 async fn start(&mut self) -> Result<(), CamelError> {
71 Ok(())
72 }
73
74 async fn stop(&mut self) -> Result<(), CamelError> {
75 Ok(())
76 }
77 }
78
79 #[tokio::test]
80 async fn test_lifecycle_trait() {
81 let mut service = TestService;
82 assert_eq!(service.name(), "test");
83 service.start().await.unwrap();
84 service.stop().await.unwrap();
85 }
86
87 #[test]
88 fn test_default_status_is_stopped() {
89 let service = TestService;
90 assert_eq!(service.status(), ServiceStatus::Stopped);
91 }
92}