use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ServiceStatus {
Running,
Available,
Absent,
Degraded,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServiceInfo {
pub id: String,
pub display_name: String,
pub status: ServiceStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hint: Option<String>,
}
pub trait ServiceConnector: Send + Sync {
fn id(&self) -> &'static str;
fn display_name(&self) -> &'static str;
fn detect(&self) -> ServiceInfo;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn service_status_serialises_to_lowercase_strings() {
assert_eq!(
serde_json::to_value(ServiceStatus::Running).unwrap(),
serde_json::json!("running"),
"Running must serialise to \"running\""
);
assert_eq!(
serde_json::to_value(ServiceStatus::Available).unwrap(),
serde_json::json!("available"),
"Available must serialise to \"available\""
);
assert_eq!(
serde_json::to_value(ServiceStatus::Absent).unwrap(),
serde_json::json!("absent"),
"Absent must serialise to \"absent\""
);
assert_eq!(
serde_json::to_value(ServiceStatus::Degraded).unwrap(),
serde_json::json!("degraded"),
"Degraded must serialise to \"degraded\""
);
}
}