summaryrefslogtreecommitdiff
path: root/cli/util/display.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/util/display.rs')
-rw-r--r--cli/util/display.rs97
1 files changed, 97 insertions, 0 deletions
diff --git a/cli/util/display.rs b/cli/util/display.rs
new file mode 100644
index 000000000..f13965e28
--- /dev/null
+++ b/cli/util/display.rs
@@ -0,0 +1,97 @@
+// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
+
+use deno_core::error::AnyError;
+use deno_core::serde_json;
+use std::io::Write;
+
+/// A function that converts a float to a string the represents a human
+/// readable version of that number.
+pub fn human_size(size: f64) -> String {
+ let negative = if size.is_sign_positive() { "" } else { "-" };
+ let size = size.abs();
+ let units = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
+ if size < 1_f64 {
+ return format!("{}{}{}", negative, size, "B");
+ }
+ let delimiter = 1024_f64;
+ let exponent = std::cmp::min(
+ (size.ln() / delimiter.ln()).floor() as i32,
+ (units.len() - 1) as i32,
+ );
+ let pretty_bytes = format!("{:.2}", size / delimiter.powi(exponent))
+ .parse::<f64>()
+ .unwrap()
+ * 1_f64;
+ let unit = units[exponent as usize];
+ format!("{}{}{}", negative, pretty_bytes, unit)
+}
+
+/// A function that converts a milisecond elapsed time to a string that
+/// represents a human readable version of that time.
+pub fn human_elapsed(elapsed: u128) -> String {
+ if elapsed < 1_000 {
+ return format!("{}ms", elapsed);
+ }
+ if elapsed < 1_000 * 60 {
+ return format!("{}s", elapsed / 1000);
+ }
+
+ let seconds = elapsed / 1_000;
+ let minutes = seconds / 60;
+ let seconds_remainder = seconds % 60;
+ format!("{}m{}s", minutes, seconds_remainder)
+}
+
+pub fn write_to_stdout_ignore_sigpipe(
+ bytes: &[u8],
+) -> Result<(), std::io::Error> {
+ use std::io::ErrorKind;
+
+ match std::io::stdout().write_all(bytes) {
+ Ok(()) => Ok(()),
+ Err(e) => match e.kind() {
+ ErrorKind::BrokenPipe => Ok(()),
+ _ => Err(e),
+ },
+ }
+}
+
+pub fn write_json_to_stdout<T>(value: &T) -> Result<(), AnyError>
+where
+ T: ?Sized + serde::ser::Serialize,
+{
+ let mut writer = std::io::BufWriter::new(std::io::stdout());
+ serde_json::to_writer_pretty(&mut writer, value)?;
+ writeln!(&mut writer)?;
+ Ok(())
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_human_size() {
+ assert_eq!(human_size(1_f64), "1B");
+ assert_eq!(human_size((12 * 1024) as f64), "12KB");
+ assert_eq!(human_size((24_i64 * 1024 * 1024) as f64), "24MB");
+ assert_eq!(human_size((24_i64 * 1024 * 1024 * 1024) as f64), "24GB");
+ assert_eq!(
+ human_size((24_i64 * 1024 * 1024 * 1024 * 1024) as f64),
+ "24TB"
+ );
+ assert_eq!(human_size(0_f64), "0B");
+ assert_eq!(human_size(-10_f64), "-10B");
+ }
+
+ #[test]
+ fn test_human_elapsed() {
+ assert_eq!(human_elapsed(1), "1ms");
+ assert_eq!(human_elapsed(256), "256ms");
+ assert_eq!(human_elapsed(1000), "1s");
+ assert_eq!(human_elapsed(1001), "1s");
+ assert_eq!(human_elapsed(1020), "1s");
+ assert_eq!(human_elapsed(70 * 1000), "1m10s");
+ assert_eq!(human_elapsed(86 * 1000 + 100), "1m26s");
+ }
+}