use std::str::FromStr;
use std::fmt::Debug;
#[derive(Debug, PartialEq)]
pub enum MemoryUnit {
Byte,
Kilobyte,
Megabyte,
Gigabyte,
Terabyte,
Petabyte,
Exabyte,
Zettabyte,
Yottabyte,
}
impl MemoryUnit {
pub fn size(&self) -> u128 {
match self {
MemoryUnit::Byte => BYTE_SIZE.into(),
MemoryUnit::Kilobyte => KILOBYTE_SIZE.into(),
MemoryUnit::Megabyte => MEGABYTE_SIZE.into(),
MemoryUnit::Gigabyte => GIGABYTE_SIZE.into(),
MemoryUnit::Terabyte => TERABYTE_SIZE.into(),
MemoryUnit::Petabyte => PETABYTE_SIZE.into(),
MemoryUnit::Exabyte => EXABYTE_SIZE.into(),
MemoryUnit::Zettabyte => ZETTABYTE_SIZE.into(),
MemoryUnit::Yottabyte => YOTTABYTE_SIZE.into(),
}
}
pub fn decimal_size(&self) -> u128 {
match self {
MemoryUnit::Byte => DECIMAL_BYTE_SIZE.into(),
MemoryUnit::Kilobyte => DECIMAL_KILOBYTE_SIZE.into(),
MemoryUnit::Megabyte => DECIMAL_MEGABYTE_SIZE.into(),
MemoryUnit::Gigabyte => DECIMAL_GIGABYTE_SIZE.into(),
MemoryUnit::Terabyte => DECIMAL_TERABYTE_SIZE.into(),
MemoryUnit::Petabyte => DECIMAL_PETABYTE_SIZE.into(),
MemoryUnit::Exabyte => DECIMAL_EXABYTE_SIZE.into(),
MemoryUnit::Zettabyte => DECIMAL_ZETTABYTE_SIZE.into(),
MemoryUnit::Yottabyte => DECIMAL_YOTTABYTE_SIZE.into(),
}
}
}
impl FromStr for MemoryUnit {
type Err = String;
fn from_str(s: &str) -> Result<MemoryUnit, String> {
let s = &s.trim().to_ascii_lowercase()[..];
match s {
"b" | "byte" => Ok(MemoryUnit::Byte),
"kb" | "kilobyte" => Ok(MemoryUnit::Kilobyte),
"mb" | "megabyte" => Ok(MemoryUnit::Megabyte),
"gb" | "gigabyte" => Ok(MemoryUnit::Gigabyte),
"tb" | "terabyte" => Ok(MemoryUnit::Terabyte),
"pb" | "petabyte" => Ok(MemoryUnit::Petabyte),
"eb" | "exabyte" => Ok(MemoryUnit::Exabyte),
"zb" | "zettabyte" => Ok(MemoryUnit::Zettabyte),
"yb" | "yottabyte" => Ok(MemoryUnit::Yottabyte),
_ => Err(String::from("Could not parse"))
}
}
}
pub const BYTE_SIZE: u32 = 1; pub const KILOBYTE_SIZE: u32 = 1_024; pub const MEGABYTE_SIZE: u32 = 1_048_576; pub const GIGABYTE_SIZE: u32 = 1_073_741_824; pub const TERABYTE_SIZE: u64 = 1_099_511_627_776; pub const PETABYTE_SIZE: u64 = 1_125_899_906_842_624; pub const EXABYTE_SIZE: u64 = 1_152_921_504_606_846_976; pub const ZETTABYTE_SIZE: u128 = 1_180_591_620_717_411_303_424; pub const YOTTABYTE_SIZE: u128 = 1_208_925_819_614_629_174_706_176;
pub const DECIMAL_BYTE_SIZE: u32 = 1; pub const DECIMAL_KILOBYTE_SIZE: u32 = 1_000; pub const DECIMAL_MEGABYTE_SIZE: u32 = 1_000_000; pub const DECIMAL_GIGABYTE_SIZE: u32 = 1_000_000_000; pub const DECIMAL_TERABYTE_SIZE: u64 = 1_000_000_000_000; pub const DECIMAL_PETABYTE_SIZE: u64 = 1_000_000_000_000_000; pub const DECIMAL_EXABYTE_SIZE: u64 = 1_000_000_000_000_000_000; pub const DECIMAL_ZETTABYTE_SIZE: u128 = 1_000_000_000_000_000_000_000; pub const DECIMAL_YOTTABYTE_SIZE: u128 = 1_000_000_000_000_000_000_000_000;