use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use strum_macros::{Display, EnumString};
#[derive(
Display,
Default,
Serialize,
Deserialize,
Clone,
Copy,
Debug,
EnumString,
PartialEq,
Eq,
JsonSchema,
PartialOrd,
Hash,
)]
#[serde(rename_all = "snake_case")]
#[strum(serialize_all = "snake_case")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub enum Load {
#[default]
Unknown,
Negligible, Low, Medium, High, VeryHigh, AtCapacity, }
impl Load {
pub fn increment(&self) -> Self {
match self {
Self::Unknown => Self::Unknown,
Self::Negligible => Self::Low,
Self::Low => Self::Medium,
Self::Medium => Self::High,
Self::High => Self::VeryHigh,
Self::VeryHigh => Self::AtCapacity,
Self::AtCapacity => Self::AtCapacity,
}
}
}
impl From<f64> for Load {
fn from(value: f64) -> Self {
if value == 0. || value.is_nan() || value.is_infinite() {
Self::Unknown
} else if value <= 0.1 {
Self::Negligible
} else if value <= 0.3 {
Self::Low
} else if value <= 0.6 {
Self::Medium
} else if value <= 0.8 {
Self::High
} else if value <= 0.95 {
Self::VeryHigh
} else {
Self::AtCapacity
}
}
}
#[derive(Serialize, Deserialize, Hash, Debug, Clone, Copy, JsonSchema, Eq, PartialEq)]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub struct NodeLoad {
pub total: Load,
pub machine: Load,
pub network: Load,
}