use serde::{Deserialize, Serialize};
use tracing::warn;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, utoipa::ToSchema)]
#[serde(rename_all = "lowercase")]
pub enum ToolchainTargetStatus {
Processing,
Ready,
Failed,
}
impl ToolchainTargetStatus {
pub fn as_str(self) -> &'static str {
match self {
Self::Processing => "processing",
Self::Ready => "ready",
Self::Failed => "failed",
}
}
pub(crate) fn from_db(status: &str) -> Self {
match status {
"processing" => Self::Processing,
"ready" => Self::Ready,
"failed" => Self::Failed,
other => {
warn!("Unknown toolchain target status {other:?}, treating it as failed");
Self::Failed
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
const ALL: [ToolchainTargetStatus; 3] = [
ToolchainTargetStatus::Processing,
ToolchainTargetStatus::Ready,
ToolchainTargetStatus::Failed,
];
#[test]
fn db_string_round_trip() {
for status in ALL {
assert_eq!(ToolchainTargetStatus::from_db(status.as_str()), status);
}
assert_eq!(ToolchainTargetStatus::Processing.as_str(), "processing");
assert_eq!(ToolchainTargetStatus::Ready.as_str(), "ready");
assert_eq!(ToolchainTargetStatus::Failed.as_str(), "failed");
}
#[test]
fn json_is_the_db_string() {
for status in ALL {
assert_eq!(
serde_json::to_value(status).unwrap(),
serde_json::Value::String(status.as_str().to_string())
);
}
}
#[test]
fn unknown_db_string_is_failed() {
assert_eq!(
ToolchainTargetStatus::from_db("Ready"),
ToolchainTargetStatus::Failed
);
}
}