summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndrew Houts <16907671+ahouts@users.noreply.github.com>2019-09-28 22:55:49 -0700
committerKevin Song <chipbuster@users.noreply.github.com>2019-09-29 00:55:48 -0500
commit0eafb2bde720b08c53eb329304d2730c150ad196 (patch)
tree96bd85278d336f333e7cc0f3380fb620a851820f /src
parent63a45d01f949596f6ee0b037c84b6e0cee598b7d (diff)
feat: add memory usage module (#403)
Adds a module to display system memory and swap usage.
Diffstat (limited to 'src')
-rw-r--r--src/module.rs1
-rw-r--r--src/modules/memory_usage.rs87
-rw-r--r--src/modules/mod.rs2
-rw-r--r--src/print.rs1
4 files changed, 91 insertions, 0 deletions
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<Module<'a>> {
+ 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<Module<'a>> {
"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",