use std::fmt;
use std::str::FromStr;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum HashRateUnitFormat {
Hs, KHs, MHs, GHs, THs, PHs, EHs, ZHs, YHs, }
impl fmt::Display for HashRateUnitFormat {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
HashRateUnitFormat::Hs => write!(f, "H/s"),
HashRateUnitFormat::KHs => write!(f, "KH/s"),
HashRateUnitFormat::MHs => write!(f, "MH/s"),
HashRateUnitFormat::GHs => write!(f, "GH/s"),
HashRateUnitFormat::THs => write!(f, "TH/s"),
HashRateUnitFormat::PHs => write!(f, "PH/s"),
HashRateUnitFormat::EHs => write!(f, "EH/s"),
HashRateUnitFormat::ZHs => write!(f, "ZH/s"),
HashRateUnitFormat::YHs => write!(f, "YH/s"),
}
}
}
pub struct GTHashRate {
pub value: String,
pub unit_str: String,
pub unit_flag: HashRateUnitFormat,
}
impl GTHashRate {
fn new(value: String, unit_str: String, unit_flag: HashRateUnitFormat) -> Self {
Self {
value,
unit_str,
unit_flag,
}
}
}
pub fn hash_rate_to_format(base_hash_rate: f64, to_format: HashRateUnitFormat, f_sed: usize) -> GTHashRate {
let k = 1_000.0;
let m = k * k;
let g = m * k;
let t = g * k;
let p = t * k;
let e = p * k;
let z = e * k;
let y = z * k;
let (cm_hs, cmp_unit, cmp_unit_str) = match to_format {
HashRateUnitFormat::YHs => (base_hash_rate / y, HashRateUnitFormat::YHs, HashRateUnitFormat::YHs.to_string()),
HashRateUnitFormat::ZHs => (base_hash_rate / z, HashRateUnitFormat::ZHs, HashRateUnitFormat::ZHs.to_string()),
HashRateUnitFormat::EHs => (base_hash_rate / e, HashRateUnitFormat::EHs, HashRateUnitFormat::EHs.to_string()),
HashRateUnitFormat::PHs => (base_hash_rate / p, HashRateUnitFormat::PHs, HashRateUnitFormat::PHs.to_string()),
HashRateUnitFormat::THs => (base_hash_rate / t, HashRateUnitFormat::THs, HashRateUnitFormat::THs.to_string()),
HashRateUnitFormat::GHs => (base_hash_rate / g, HashRateUnitFormat::GHs, HashRateUnitFormat::GHs.to_string()),
HashRateUnitFormat::MHs => (base_hash_rate / m, HashRateUnitFormat::MHs, HashRateUnitFormat::MHs.to_string()),
HashRateUnitFormat::KHs => (base_hash_rate / k, HashRateUnitFormat::KHs, HashRateUnitFormat::KHs.to_string()),
HashRateUnitFormat::Hs | _ => (base_hash_rate, HashRateUnitFormat::Hs, HashRateUnitFormat::Hs.to_string()),
};
GTHashRate::new(format!("{:.*}", f_sed, cm_hs), cmp_unit_str, cmp_unit)
}
pub fn hash_rate_format_with_sed(hs: f64, f_sed: usize) -> String {
let k = 1_000.0;
let m = k * k;
let g = m * k;
let t = g * k;
let p = t * k;
let e = p * k;
let z = e * k;
let y = z * k;
let hsr = if hs >= y {
hash_rate_to_format(hs, HashRateUnitFormat::YHs, f_sed)
} else if hs >= z {
hash_rate_to_format(hs, HashRateUnitFormat::ZHs, f_sed)
} else if hs >= e {
hash_rate_to_format(hs, HashRateUnitFormat::EHs, f_sed)
} else if hs >= p {
hash_rate_to_format(hs, HashRateUnitFormat::PHs, f_sed)
} else if hs >= t {
hash_rate_to_format(hs, HashRateUnitFormat::THs, f_sed)
} else if hs >= g {
hash_rate_to_format(hs, HashRateUnitFormat::GHs, f_sed)
} else if hs >= m {
hash_rate_to_format(hs, HashRateUnitFormat::MHs, f_sed)
} else if hs >= k {
hash_rate_to_format(hs, HashRateUnitFormat::KHs, f_sed)
} else {
hash_rate_to_format(hs, HashRateUnitFormat::Hs, f_sed)
};
format!("{} {}", hsr.value, hsr.unit_str)
}
pub fn hash_rate_format(hs: f64) -> String {
hash_rate_format_with_sed(hs,3)
}