use crate::{CamelError, MetricsCollector};
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ServiceStatus {
Stopped,
Started,
Failed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum HealthStatus {
Healthy,
Unhealthy,
}
#[async_trait]
pub trait Lifecycle: Send + Sync {
fn name(&self) -> &str;
async fn start(&mut self) -> Result<(), CamelError>;
async fn stop(&mut self) -> Result<(), CamelError>;
fn as_metrics_collector(&self) -> Option<Arc<dyn MetricsCollector>> {
None
}
fn status(&self) -> ServiceStatus {
ServiceStatus::Stopped
}
}
#[cfg(test)]
mod tests {
use super::*;
struct TestService;
#[async_trait]
impl Lifecycle for TestService {
fn name(&self) -> &str {
"test"
}
async fn start(&mut self) -> Result<(), CamelError> {
Ok(())
}
async fn stop(&mut self) -> Result<(), CamelError> {
Ok(())
}
}
#[tokio::test]
async fn test_lifecycle_trait() {
let mut service = TestService;
assert_eq!(service.name(), "test");
service.start().await.unwrap();
service.stop().await.unwrap();
}
#[test]
fn test_default_status_is_stopped() {
let service = TestService;
assert_eq!(service.status(), ServiceStatus::Stopped);
}
}