use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum NnsTopologyAssessmentStatus {
Ok,
Attention,
}
impl NnsTopologyAssessmentStatus {
#[cfg(feature = "host")]
pub(crate) const fn from_ok(is_ok: bool) -> Self {
if is_ok { Self::Ok } else { Self::Attention }
}
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Ok => "ok",
Self::Attention => "attention",
}
}
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum NnsTopologyCapacityStatus {
Over,
Unknown,
Full,
Available,
}
impl NnsTopologyCapacityStatus {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Over => "over",
Self::Unknown => "unknown",
Self::Full => "full",
Self::Available => "available",
}
}
#[cfg(feature = "host")]
pub(crate) const fn sort_rank(self) -> u8 {
match self {
Self::Over => 0,
Self::Unknown => 1,
Self::Full => 2,
Self::Available => 3,
}
}
pub(crate) const fn needs_attention(self) -> bool {
matches!(self, Self::Over | Self::Unknown)
}
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum NnsTopologyProviderStatus {
UnknownProvider,
Over,
Unused,
Ok,
}
impl NnsTopologyProviderStatus {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::UnknownProvider => "unknown_provider",
Self::Over => "over",
Self::Unused => "unused",
Self::Ok => "ok",
}
}
#[cfg(feature = "host")]
pub(crate) const fn sort_rank(self) -> u8 {
match self {
Self::UnknownProvider => 0,
Self::Over => 1,
Self::Unused => 2,
Self::Ok => 3,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn assessment_status_labels_round_trip() {
assert_status_labels(&[
(NnsTopologyAssessmentStatus::Ok, "ok"),
(NnsTopologyAssessmentStatus::Attention, "attention"),
]);
}
#[test]
fn capacity_status_labels_round_trip() {
assert_status_labels(&[
(NnsTopologyCapacityStatus::Over, "over"),
(NnsTopologyCapacityStatus::Unknown, "unknown"),
(NnsTopologyCapacityStatus::Full, "full"),
(NnsTopologyCapacityStatus::Available, "available"),
]);
}
#[test]
fn provider_status_labels_round_trip() {
assert_status_labels(&[
(
NnsTopologyProviderStatus::UnknownProvider,
"unknown_provider",
),
(NnsTopologyProviderStatus::Over, "over"),
(NnsTopologyProviderStatus::Unused, "unused"),
(NnsTopologyProviderStatus::Ok, "ok"),
]);
}
fn assert_status_labels<T>(cases: &[(T, &str)])
where
T: Copy + std::fmt::Debug + Eq + serde::Serialize + serde::de::DeserializeOwned,
{
for &(status, label) in cases {
assert_eq!(
serde_json::to_string(&status).unwrap(),
format!("\"{label}\"")
);
assert_eq!(
serde_json::from_str::<T>(&format!("\"{label}\"")).unwrap(),
status
);
}
}
}