lb_rs/model/
usage.rs

1use crate::model::api::GetUsageResponse;
2use crate::service::usage::{UsageItemMetric, UsageMetrics};
3
4const BYTE: u64 = 1;
5const KILOBYTE: u64 = BYTE * 1000;
6const MEGABYTE: u64 = KILOBYTE * 1000;
7const GIGABYTE: u64 = MEGABYTE * 1000;
8const TERABYTE: u64 = GIGABYTE * 1000;
9
10const KILOBYTE_MINUS_ONE: u64 = KILOBYTE - 1;
11const MEGABYTE_MINUS_ONE: u64 = MEGABYTE - 1;
12const GIGABYTE_MINUS_ONE: u64 = GIGABYTE - 1;
13const TERABYTE_MINUS_ONE: u64 = TERABYTE - 1;
14
15pub fn bytes_to_human(size: u64) -> String {
16    let (unit, abbr) = match size {
17        0..=KILOBYTE_MINUS_ONE => (BYTE, "B"),
18        KILOBYTE..=MEGABYTE_MINUS_ONE => (KILOBYTE, "KB"),
19        MEGABYTE..=GIGABYTE_MINUS_ONE => (MEGABYTE, "MB"),
20        GIGABYTE..=TERABYTE_MINUS_ONE => (GIGABYTE, "GB"),
21        TERABYTE..=u64::MAX => (TERABYTE, "TB"),
22    };
23
24    let size_in_unit = size as f64 / unit as f64;
25    let dec = f64::trunc(size_in_unit.fract() * 100.0) / 100.0;
26
27    let num = format!("{:.2}", size_in_unit.trunc() + dec)
28        .trim_end_matches(['0'])
29        .trim_end_matches(['.'])
30        .to_owned();
31
32    format!("{num} {abbr}")
33}
34
35pub(crate) fn get_usage(server_usage_and_cap: GetUsageResponse) -> UsageMetrics {
36    let server_usage = server_usage_and_cap.sum_server_usage();
37    let cap = server_usage_and_cap.cap;
38
39    let readable_usage = bytes_to_human(server_usage);
40    let readable_cap = bytes_to_human(cap);
41
42    UsageMetrics {
43        usages: server_usage_and_cap.usages,
44        server_usage: UsageItemMetric { exact: server_usage, readable: readable_usage },
45        data_cap: UsageItemMetric { exact: cap, readable: readable_cap },
46    }
47}