Skip to main content

nym_node_requests/api/v1/node_load/
models.rs

1// Copyright 2025 - Nym Technologies SA <contact@nymtech.net>
2// SPDX-License-Identifier: Apache-2.0
3
4use schemars::JsonSchema;
5use serde::{Deserialize, Serialize};
6use strum_macros::{Display, EnumString};
7
8#[derive(
9    Display,
10    Default,
11    Serialize,
12    Deserialize,
13    Clone,
14    Copy,
15    Debug,
16    EnumString,
17    PartialEq,
18    Eq,
19    JsonSchema,
20    PartialOrd,
21    Hash,
22)]
23#[serde(rename_all = "snake_case")]
24#[strum(serialize_all = "snake_case")]
25#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
26pub enum Load {
27    #[default]
28    Unknown,
29
30    // order of the variants matter as we've derived `PartialOrd` on them
31    Negligible, // 0 - 0.1
32    Low,        // 0.1 - 0.3
33    Medium,     // 0.3 - 0.6
34    High,       // 0.6 - 0.8
35    VeryHigh,   // 0.8 - 0.95
36    AtCapacity, // >= 0.95
37}
38
39impl Load {
40    // returns load of one tier higher
41    pub fn increment(&self) -> Self {
42        match self {
43            Self::Unknown => Self::Unknown,
44            Self::Negligible => Self::Low,
45            Self::Low => Self::Medium,
46            Self::Medium => Self::High,
47            Self::High => Self::VeryHigh,
48            Self::VeryHigh => Self::AtCapacity,
49            Self::AtCapacity => Self::AtCapacity,
50        }
51    }
52}
53
54impl From<f64> for Load {
55    fn from(value: f64) -> Self {
56        if value == 0. || value.is_nan() || value.is_infinite() {
57            Self::Unknown
58        } else if value <= 0.1 {
59            Self::Negligible
60        } else if value <= 0.3 {
61            Self::Low
62        } else if value <= 0.6 {
63            Self::Medium
64        } else if value <= 0.8 {
65            Self::High
66        } else if value <= 0.95 {
67            Self::VeryHigh
68        } else {
69            Self::AtCapacity
70        }
71    }
72}
73
74#[derive(Serialize, Deserialize, Hash, Debug, Clone, Copy, JsonSchema, Eq, PartialEq)]
75#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
76pub struct NodeLoad {
77    pub total: Load,
78    pub machine: Load,
79    pub network: Load,
80}