summaryrefslogtreecommitdiffstats
path: root/src/meta/size.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/meta/size.rs')
-rw-r--r--src/meta/size.rs94
1 files changed, 56 insertions, 38 deletions
diff --git a/src/meta/size.rs b/src/meta/size.rs
index 021b337..29946e2 100644
--- a/src/meta/size.rs
+++ b/src/meta/size.rs
@@ -12,44 +12,51 @@ pub enum Unit {
#[derive(Debug, PartialEq, Eq)]
pub struct Size {
- value: i64,
- unit: Unit,
+ value: Option<i64>,
+ unit: Option<Unit>,
}
-impl Size {
- pub fn from_bytes(meta: &Metadata) -> Option<Self> {
- if !meta.is_file() {
- return None;
- }
+impl<'a> From<&'a Metadata> for Size {
+ fn from(meta: &Metadata) -> Self {
+ let len = meta.len();
- Some(Size::get_file_size(meta.len() as i64))
+ if meta.is_file() {
+ Size::from_bytes(len as i64)
+ } else {
+ Size {
+ value: None,
+ unit: None,
+ }
+ }
}
+}
- fn get_file_size(len: i64) -> Self {
+impl Size {
+ fn from_bytes(len: i64) -> Self {
if len < 1024 {
Size {
- value: len * 1024,
- unit: Unit::Byte,
+ value: Some(len * 1024),
+ unit: Some(Unit::Byte),
}
} else if len < 1024 * 1024 {
Size {
- value: len,
- unit: Unit::Kilo,
+ value: Some(len),
+ unit: Some(Unit::Kilo),
}
} else if len < 1024 * 1024 * 1024 {
Size {
- value: len / 1024,
- unit: Unit::Mega,
+ value: Some(len / 1024),
+ unit: Some(Unit::Mega),
}
} else if len < 1024 * 1024 * 1024 * 1024 {
Size {
- value: len / (1024 * 1024),
- unit: Unit::Giga,
+ value: Some(len / (1024 * 1024)),
+ unit: Some(Unit::Giga),
}
} else {
Size {
- value: len / (1024 * 1024 * 1024),
- unit: Unit::Tera,
+ value: Some(len / (1024 * 1024 * 1024)),
+ unit: Some(Unit::Tera),
}
}
}
@@ -81,17 +88,25 @@ impl Size {
}
fn paint(&self, colors: &Colors, content: String) -> ColoredString {
- if self.unit == Unit::Byte || self.unit == Unit::Kilo {
- colors.colorize(content, &Elem::FileSmall)
- } else if self.unit == Unit::Mega {
- colors.colorize(content, &Elem::FileMedium)
- } else {
- colors.colorize(content, &Elem::FileLarge)
+ match self.unit {
+ Some(ref unit) => {
+ if unit == &Unit::Byte || unit == &Unit::Kilo {
+ colors.colorize(content, &Elem::FileSmall)
+ } else if unit == &Unit::Mega {
+ colors.colorize(content, &Elem::FileMedium)
+ } else {
+ colors.colorize(content, &Elem::FileLarge)
+ }
+ }
+ None => colors.colorize(content, &Elem::NonFile),
}
}
pub fn render_value(&self) -> String {
- let size_str = (self.value as f32 / 1024.0).to_string();
+ let size_str = match self.value {
+ Some(value) => (value as f32 / 1024.0).to_string(),
+ None => "".to_string(),
+ };
// Check if there is a fraction.
if let Some(fraction_idx) = size_str.find('.') {
@@ -112,11 +127,14 @@ impl Size {
pub fn render_unit(&self) -> String {
match self.unit {
- Unit::Byte => String::from("B"),
- Unit::Kilo => String::from("KB"),
- Unit::Mega => String::from("MB"),
- Unit::Giga => String::from("GB"),
- Unit::Tera => String::from("TB"),
+ Some(ref unit) => match unit {
+ Unit::Byte => String::from("B"),
+ Unit::Kilo => String::from("KB"),
+ Unit::Mega => String::from("MB"),
+ Unit::Giga => String::from("GB"),
+ Unit::Tera => String::from("TB"),
+ },
+ None => String::from("-"),
}
}
}
@@ -127,7 +145,7 @@ mod tests {
#[test]
fn render_byte() {
- let size = Size::get_file_size(42); // == 42 bytes
+ let size = Size::from_bytes(42); // == 42 bytes
assert_eq!(size.render_value().as_str(), "42");
assert_eq!(size.render_unit().as_str(), "B");
@@ -135,7 +153,7 @@ mod tests {
#[test]
fn render_kilobyte() {
- let size = Size::get_file_size(42 * 1024); // 42 kilobytes
+ let size = Size::from_bytes(42 * 1024); // 42 kilobytes
assert_eq!(size.render_value().as_str(), "42");
assert_eq!(size.render_unit().as_str(), "KB");
@@ -143,7 +161,7 @@ mod tests {
#[test]
fn render_megabyte() {
- let size = Size::get_file_size(42 * 1024 * 1024); // 42 megabytes
+ let size = Size::from_bytes(42 * 1024 * 1024); // 42 megabytes
assert_eq!(size.render_value().as_str(), "42");
assert_eq!(size.render_unit().as_str(), "MB");
@@ -151,7 +169,7 @@ mod tests {
#[test]
fn render_gigabyte() {
- let size = Size::get_file_size(42 * 1024 * 1024 * 1024); // 42 gigabytes
+ let size = Size::from_bytes(42 * 1024 * 1024 * 1024); // 42 gigabytes
assert_eq!(size.render_value().as_str(), "42");
assert_eq!(size.render_unit().as_str(), "GB");
@@ -159,7 +177,7 @@ mod tests {
#[test]
fn render_terabyte() {
- let size = Size::get_file_size(42 * 1024 * 1024 * 1024 * 1024); // 42 terabytes
+ let size = Size::from_bytes(42 * 1024 * 1024 * 1024 * 1024); // 42 terabytes
assert_eq!(size.render_value().as_str(), "42");
assert_eq!(size.render_unit().as_str(), "TB");
@@ -167,7 +185,7 @@ mod tests {
#[test]
fn render_with_a_fraction() {
- let size = Size::get_file_size(42 * 1024 + 103); // 42.1 kilobytes
+ let size = Size::from_bytes(42 * 1024 + 103); // 42.1 kilobytes
assert_eq!(size.render_value().as_str(), "42.1");
assert_eq!(size.render_unit().as_str(), "KB");
@@ -175,7 +193,7 @@ mod tests {
#[test]
fn render_with_a_truncated_fraction() {
- let size = Size::get_file_size(42 * 1024 + 1); // 42.001 kilobytes == 42 kilobytes
+ let size = Size::from_bytes(42 * 1024 + 1); // 42.001 kilobytes == 42 kilobytes
assert_eq!(size.render_value().as_str(), "42");
assert_eq!(size.render_unit().as_str(), "KB");