acumen 0.0.3

Collect info about your system
Documentation
use std::{borrow::Borrow, collections::BTreeMap, fs, io};

use crate::impl_getters;

#[derive(Debug)]
pub struct Meminfo(BTreeMap<String, usize>);

impl Meminfo {
    pub fn new() -> Self {
        Self(Self::new_inner().unwrap_or(BTreeMap::new()))
    }

    pub fn try_new() -> Result<Self, io::Error> {
        Self::new_inner().map(Self)
    }

    fn new_inner() -> Result<BTreeMap<String, usize>, io::Error> {
        let meminfo_file = fs::read_to_string("/proc/meminfo")?;

        let mut entries = BTreeMap::new();

        for line in meminfo_file.lines().filter(|line| !line.is_empty()) {
            if let Some((name, content)) = line.split_once(':') {
                if let Ok(value) = content.trim_end_matches("kB").trim().parse() {
                    entries.insert(name.trim().to_string(), value);
                }
            }
        }

        Ok(entries)
    }

    #[inline]
    pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<usize>
    where
        String: Borrow<Q>,
        Q: Ord,
    {
        self.0.get(key).copied()
    }

    impl_getters! {
        usize,
        mem_total: "MemTotal"
    }
}