use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum Health {
#[default]
Unknown,
Starting,
Ready,
Busy,
SetupFailed,
Defunct,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum HealthResponse {
Unknown,
Starting,
Ready,
Busy,
SetupFailed,
Defunct,
Unhealthy,
}
impl From<Health> for HealthResponse {
fn from(health: Health) -> Self {
match health {
Health::Unknown => HealthResponse::Unknown,
Health::Starting => HealthResponse::Starting,
Health::Ready => HealthResponse::Ready,
Health::Busy => HealthResponse::Busy,
Health::SetupFailed => HealthResponse::SetupFailed,
Health::Defunct => HealthResponse::Defunct,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum SetupStatus {
Starting,
Succeeded,
Failed,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SetupResult {
pub started_at: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub completed_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<SetupStatus>,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub logs: String,
}
impl SetupResult {
pub fn starting() -> Self {
Self {
started_at: chrono::Utc::now().to_rfc3339(),
completed_at: None,
status: Some(SetupStatus::Starting),
logs: String::new(),
}
}
pub fn succeeded(mut self, logs: String) -> Self {
self.completed_at = Some(chrono::Utc::now().to_rfc3339());
self.status = Some(SetupStatus::Succeeded);
self.logs = logs;
self
}
pub fn failed(mut self, logs: String) -> Self {
self.completed_at = Some(chrono::Utc::now().to_rfc3339());
self.status = Some(SetupStatus::Failed);
self.logs = logs;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn health_default_is_unknown() {
assert_eq!(Health::default(), Health::Unknown);
}
#[test]
fn health_serializes_screaming_snake_case() {
insta::assert_json_snapshot!(
"health_all_variants",
[
Health::Unknown,
Health::Starting,
Health::Ready,
Health::Busy,
Health::SetupFailed,
Health::Defunct,
]
);
}
#[test]
fn health_response_serializes_screaming_snake_case() {
insta::assert_json_snapshot!(
"health_response_all_variants",
[
HealthResponse::Unknown,
HealthResponse::Starting,
HealthResponse::Ready,
HealthResponse::Busy,
HealthResponse::SetupFailed,
HealthResponse::Defunct,
HealthResponse::Unhealthy,
]
);
}
#[test]
fn health_deserializes_screaming_snake_case() {
assert_eq!(
serde_json::from_str::<Health>("\"READY\"").unwrap(),
Health::Ready
);
assert_eq!(
serde_json::from_str::<Health>("\"SETUP_FAILED\"").unwrap(),
Health::SetupFailed
);
}
#[test]
fn setup_status_serializes_lowercase() {
insta::assert_json_snapshot!(
"setup_status_all_variants",
[
SetupStatus::Starting,
SetupStatus::Succeeded,
SetupStatus::Failed,
]
);
}
#[test]
fn setup_status_deserializes_lowercase() {
assert_eq!(
serde_json::from_str::<SetupStatus>("\"succeeded\"").unwrap(),
SetupStatus::Succeeded
);
}
}