zinfo 0.2.1

A small system information program
Documentation
use std::{
    fs::File,
    io::{self, BufRead, BufReader},
};

#[cfg(not(target_os = "linux"))]
use std::process::Command;

mod kver;
mod logo;
mod sysinfo;
mod uptime;

pub use kver::get_kver;
pub use logo::logo;
pub use sysinfo::SysInfo;
pub use uptime::get_uptime;

#[cfg(not(target_os = "linux"))]
pub fn get_output(command: &str, args: &[&str], default: &str) -> String {
    if let Ok(output) = Command::new(command).args(args).output() {
        if let Ok(s) = String::from_utf8(output.stdout) {
            s.trim().to_owned()
        } else {
            default.to_owned()
        }
    } else {
        default.to_owned()
    }
}

pub fn get_mem() -> io::Result<String> {
    let meminfo = File::open("/proc/meminfo")?;
    let reader = BufReader::new(meminfo).lines();

    let mut total = 0;
    let mut free = 0;

    for line in reader {
        let l: Vec<String> = line?.split_whitespace().map(str::to_owned).collect();
        match l[0].as_str() {
            "MemTotal:" => {
                total = l[1].parse::<i32>().unwrap_or(0);
                free = total;
            }
            "MemFree:" | "Buffers:" | "Cached:" => {
                free -= l[1].parse::<i32>().unwrap_or(0);
            }
            "SReclaimable:" => {
                free -= l[1].parse::<i32>().unwrap_or(0);
                break;
            }
            _ => (),
        }
    }

    Ok(format!("{}M / {}M", free / 1024, total / 1024))
}