parallel_disk_usage/bytes_format/
formatter.rs1use super::{scale_base, ParsedValue};
2use std::fmt::Debug;
3
4#[derive(Debug, Clone, Copy)]
6pub struct Formatter {
7 scale_base: u64,
8}
9
10impl Formatter {
11 pub const fn new(scale_base: u64) -> Self {
13 Formatter { scale_base }
14 }
15
16 pub const fn scale_base(self) -> u64 {
18 self.scale_base
19 }
20
21 pub const fn scale(self, exp: u32) -> u64 {
23 self.scale_base().pow(exp)
24 }
25
26 pub fn parse_value(self, value: u64) -> ParsedValue {
28 let float_value = value as f32;
29 macro_rules! check {
30 ($exp:literal => $unit:literal) => {{
31 let scale = self.scale($exp);
32 if value >= scale {
33 return ParsedValue::Big {
34 coefficient: float_value / (scale as f32),
35 unit: $unit,
36 exponent: $exp,
37 scale,
38 };
39 }
40 }};
41 }
42
43 check!(5 => 'P');
44 check!(4 => 'T');
45 check!(3 => 'G');
46 check!(2 => 'M');
47 check!(1 => 'K');
48 ParsedValue::Small {
49 value: value as u16,
50 }
51 }
52}
53
54macro_rules! variant {
55 ($(#[$attributes:meta])* $name:ident) => {
56 $(#[$attributes])*
57 pub const $name: Formatter = Formatter::new(scale_base::$name);
58 };
59}
60
61variant! {
62 METRIC
64}
65
66variant! {
67 BINARY
69}