From 6a349a0e0282e56b03adbe02b41bfaf0cc3213f1 Mon Sep 17 00:00:00 2001 From: mustafa salih Date: Thu, 14 Jan 2021 05:41:01 +0300 Subject: orginized the code to seprated mods and deleted the lib file --- src/utils/memory.rs | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/utils/memory.rs (limited to 'src/utils/memory.rs') diff --git a/src/utils/memory.rs b/src/utils/memory.rs new file mode 100644 index 0000000..1a6c982 --- /dev/null +++ b/src/utils/memory.rs @@ -0,0 +1,85 @@ +use crate::types::Config; +use std::fs::File; +use std::io::Read; + +/* +mem_used = (mem_total + shmem - mem_free - mem_buffers - mem_cached - mem_srecl +thanks for htop's developer on stackoverflow for providing this algorithm to +calculate used memory. +*/ +pub fn get_memory(config: &Config) -> Result { + let mut buf = String::new(); + + File::open("/proc/meminfo")?.read_to_string(&mut buf)?; + + let mut mem_total: u32 = 0; + let mut shmem: u32 = 0; + let mut mem_free: u32 = 0; + let mut mem_buffers: u32 = 0; + let mut mem_cached: u32 = 0; + let mut mem_srecl: u32 = 0; + + for line in buf.lines() { + if mem_total > 0 + && shmem > 0 + && mem_free > 0 + && mem_buffers > 0 + && mem_cached > 0 + && mem_srecl > 0 + { + break; + } + if line.starts_with("MemTotal") { + assign_val(line, &mut mem_total); + } + if line.starts_with("SReclaimable") { + assign_val(line, &mut mem_srecl) + } + if line.starts_with("Cached") { + assign_val(line, &mut mem_cached) + } + + if line.starts_with("Shmem") { + assign_val(line, &mut shmem); + } + + if line.starts_with("MemFree") { + assign_val(line, &mut mem_free); + } + if line.starts_with("Buffers") { + assign_val(line, &mut mem_buffers); + } + } + + let mem_used = (mem_total + shmem - mem_free - mem_buffers - mem_cached - mem_srecl) / 1024; + let result: String; + if mem_used > 1000 { + result = format!( + " {} {:.1}G {}", + config.memory.icon, + mem_used as f32 / 1000.0, + config.seperator + ); + } else { + result = format!( + " {} {}M {}", + config.memory.icon, mem_used, config.seperator + ); + } + Ok(result) +} + +/* +this helper function will split the line(first argument) by the character(:) +and then parse the right splited item as u32 +then assign that to the "assignable"(2nd argument). +*/ +fn assign_val(line: &str, assignable: &mut u32) { + let parsed: u32 = line.split(':').collect::>()[1] + .trim() + .split(' ') + .collect::>()[0] + .parse() + .unwrap(); + *assignable = parsed; +} -- cgit v1.2.3