From 0eafb2bde720b08c53eb329304d2730c150ad196 Mon Sep 17 00:00:00 2001 From: Andrew Houts <16907671+ahouts@users.noreply.github.com> Date: Sat, 28 Sep 2019 22:55:49 -0700 Subject: feat: add memory usage module (#403) Adds a module to display system memory and swap usage. --- src/module.rs | 1 + src/modules/memory_usage.rs | 87 +++++++++++++++++++++++++++++++++++++++++++++ src/modules/mod.rs | 2 ++ src/print.rs | 1 + 4 files changed, 91 insertions(+) create mode 100644 src/modules/memory_usage.rs (limited to 'src') diff --git a/src/module.rs b/src/module.rs index 7ebfa53e2..65e69c36d 100644 --- a/src/module.rs +++ b/src/module.rs @@ -21,6 +21,7 @@ pub const ALL_MODULES: &[&str] = &[ "java", "jobs", "line_break", + "memory_usage", "nix_shell", "nodejs", "package", diff --git a/src/modules/memory_usage.rs b/src/modules/memory_usage.rs new file mode 100644 index 000000000..b8fe4fbf9 --- /dev/null +++ b/src/modules/memory_usage.rs @@ -0,0 +1,87 @@ +use ansi_term::Color; + +use super::{Context, Module}; +use byte_unit::{Byte, ByteUnit}; +use sysinfo::{RefreshKind, SystemExt}; + +/// Creates a module with system memory usage information +pub fn module<'a>(context: &'a Context) -> Option> { + const DEFAULT_THRESHOLD: i64 = 75; + const DEFAULT_SHOW_PERCENTAGE: bool = false; + const RAM_CHAR: &str = "🐏 "; + + let mut module = context.new_module("memory_usage"); + + let module_style = module + .config_value_style("style") + .unwrap_or_else(|| Color::White.bold().dimmed()); + + let system = sysinfo::System::new_with_specifics(RefreshKind::new().with_system()); + + let used_memory_kib = system.get_used_memory(); + let total_memory_kib = system.get_total_memory(); + let used_swap_kib = system.get_used_swap(); + let total_swap_kib = system.get_total_swap(); + + let percent_mem_used = (used_memory_kib as f64 / total_memory_kib as f64) * 100.; + let percent_swap_used = (used_swap_kib as f64 / total_swap_kib as f64) * 100.; + + let threshold = module + .config_value_i64("threshold") + .unwrap_or(DEFAULT_THRESHOLD); + + if percent_mem_used.round() < threshold as f64 { + return None; + } + + let show_percentage = module + .config_value_bool("show_percentage") + .unwrap_or(DEFAULT_SHOW_PERCENTAGE); + + let (display_mem, display_swap) = if show_percentage { + ( + format!("{:.0}%", percent_mem_used), + format!("{:.0}%", percent_swap_used), + ) + } else { + fn format_kib(n_kib: u64) -> String { + let byte = Byte::from_unit(n_kib as f64, ByteUnit::KiB) + .unwrap_or_else(|_| Byte::from_bytes(0)); + let mut display_bytes = byte.get_appropriate_unit(true).format(0); + display_bytes.retain(|c| c != ' '); + display_bytes + } + ( + format!( + "{}/{}", + format_kib(used_memory_kib), + format_kib(total_memory_kib) + ), + format!( + "{}/{}", + format_kib(used_swap_kib), + format_kib(total_swap_kib) + ), + ) + }; + + let show_swap = module + .config_value_bool("show_swap") + .unwrap_or(total_swap_kib != 0); + + module.new_segment("symbol", RAM_CHAR); + + module.set_style(module_style); + if show_swap { + module.new_segment( + "memory_usage", + &format!("{} | {}", display_mem, display_swap), + ); + } else { + module.new_segment("memory_usage", &display_mem); + } + + module.get_prefix().set_value(""); + + Some(module) +} diff --git a/src/modules/mod.rs b/src/modules/mod.rs index 82d3614a7..f073c5a6c 100644 --- a/src/modules/mod.rs +++ b/src/modules/mod.rs @@ -12,6 +12,7 @@ mod hostname; mod java; mod jobs; mod line_break; +mod memory_usage; mod nix_shell; mod nodejs; mod package; @@ -52,6 +53,7 @@ pub fn handle<'a>(module: &str, context: &'a Context) -> Option> { "nix_shell" => nix_shell::module(context), "hostname" => hostname::module(context), "time" => time::module(context), + "memory_usage" => memory_usage::module(context), _ => { eprintln!("Error: Unknown module {}. Use starship module --list to list out all supported modules.", module); diff --git a/src/print.rs b/src/print.rs index 18fe5ea14..eed2ee8b3 100644 --- a/src/print.rs +++ b/src/print.rs @@ -26,6 +26,7 @@ const DEFAULT_PROMPT_ORDER: &[&str] = &[ "golang", "java", "nix_shell", + "memory_usage", "aws", "env_var", "cmd_duration", -- cgit v1.2.3