procstat 1.0.4

Parses the /proc/stat file into a struct.
Documentation
#[derive(Debug)]
pub struct CPU {
    pub user: u64,
    pub nice: u64,
    pub system: u64,
    pub idle: u64,
    pub iowait: u64,
    pub irq: u64,
    pub softirq: u64,
    pub steal: u64,
    pub guest: u64,
    pub guest_nice: u64,
}

impl CPU {
    pub fn empty() -> CPU {
        CPU {
            user: 0,
            nice: 0,
            system: 0,
            idle: 0,
            iowait: 0,
            irq: 0,
            softirq: 0,
            steal: 0,
            guest: 0,
            guest_nice: 0,
        }
    }

    pub fn from_vec(cpu_vals: Vec<u64>) -> CPU {
        CPU {
            user: unwrap_or_0(cpu_vals.get(0)),
            nice: unwrap_or_0(cpu_vals.get(1)),
            system: unwrap_or_0(cpu_vals.get(2)),
            idle: unwrap_or_0(cpu_vals.get(3)),
            iowait: unwrap_or_0(cpu_vals.get(4)),
            irq: unwrap_or_0(cpu_vals.get(5)),
            softirq: unwrap_or_0(cpu_vals.get(6)),
            steal: unwrap_or_0(cpu_vals.get(7)),
            guest: unwrap_or_0(cpu_vals.get(8)),
            guest_nice: unwrap_or_0(cpu_vals.get(9)),
        }
    }

    pub fn total(&self) -> u64 {
        self.user + self.nice + self.system + self.idle + self.iowait + self.irq + self.softirq + self.steal + self.guest + self.guest_nice
    }
}

fn unwrap_or_0(wrapped: Option<&u64>) -> u64 {
    match wrapped {
        Some(value) => *value,
        None => 0,
    }
}


#[cfg(test)]
mod tests {
    use crate::cpu::CPU;

    #[test]
    fn given_10_columns_it_populates_all_fields() {
        let test_data: Vec<u64> = vec![46044323, 3582636, 101626186, 3138393496, 2100903, 1, 224268, 2, 3, 4];
        let cpu: CPU = CPU::from_vec(test_data);
        
        assert_eq!(cpu.user, 46044323);
        assert_eq!(cpu.nice, 3582636);
        assert_eq!(cpu.system, 101626186);
        assert_eq!(cpu.idle, 3138393496);
        assert_eq!(cpu.iowait, 2100903);
        assert_eq!(cpu.irq, 1);
        assert_eq!(cpu.softirq, 224268);
        assert_eq!(cpu.steal, 2);
        assert_eq!(cpu.guest, 3);
        assert_eq!(cpu.guest_nice, 4);
    }

    #[test]
    fn given_6_columns_it_populates_remaining_fields_with_0() {
        let test_data: Vec<u64> = vec![46044323, 3582636, 101626186, 3138393496, 2100903, 1];
        let cpu: CPU = CPU::from_vec(test_data);
        
        assert_eq!(cpu.user, 46044323);
        assert_eq!(cpu.nice, 3582636);
        assert_eq!(cpu.system, 101626186);
        assert_eq!(cpu.idle, 3138393496);
        assert_eq!(cpu.iowait, 2100903);
        assert_eq!(cpu.irq, 1);
        assert_eq!(cpu.softirq, 0);
        assert_eq!(cpu.steal, 0);
        assert_eq!(cpu.guest, 0);
        assert_eq!(cpu.guest_nice, 0);
    }

    #[test]
    fn returns_back_empty_cpu_if_vec_is_empty() {
        let cpu: CPU = CPU::from_vec(Vec::new());
        
        assert_eq!(cpu.user, 0);
        assert_eq!(cpu.nice, 0);
        assert_eq!(cpu.system, 0);
        assert_eq!(cpu.idle, 0);
        assert_eq!(cpu.iowait, 0);
        assert_eq!(cpu.irq, 0);
        assert_eq!(cpu.softirq, 0);
        assert_eq!(cpu.steal, 0);
        assert_eq!(cpu.guest, 0);
        assert_eq!(cpu.guest_nice, 0);
    }

    #[test]
    fn sums_together_all_fields() {
        let test_data: Vec<u64> = vec![46044323, 3582636, 101626186, 3138393496, 2100903, 1];
        let cpu: CPU = CPU::from_vec(test_data);

        assert_eq!(cpu.total(), 3291747545);
    }
}