pub(super) fn mem_total(meminfo: &str) -> Option<u64> {
let value = meminfo
.lines()
.find_map(|line| line.strip_prefix("MemTotal:"))?;
let kib: u64 = value.trim().strip_suffix("kB")?.trim().parse().ok()?;
kib.checked_mul(1024)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn mem_total_is_read_in_kibibytes_past_the_free_and_available_lines() {
let meminfo = "MemFree: 480112 kB\nMemAvailable: 12035340 kB\nMemTotal: 16374836 kB\nBuffers: 201376 kB\n";
assert_eq!(mem_total(meminfo), Some(16_374_836 * 1024));
}
#[test]
fn a_missing_or_malformed_line_gives_no_figure() {
assert_eq!(mem_total("MemAvailable: 12035340 kB\n"), None);
assert_eq!(mem_total("MemTotal: lots kB\n"), None);
assert_eq!(mem_total("MemTotal: 16374836 MB\n"), None);
}
}