hw_linux/cpu/
cores.rs

1use crate::{is_linux, InfoTrait};
2use std::error::Error;
3use std::fs;
4
5#[derive(Default, Clone, Debug)]
6pub struct Core {
7    pub name: Option<String>,
8    pub usage: Option<u64>,
9}
10
11#[derive(Default, Clone, Debug)]
12pub struct Cores(pub Vec<Core>);
13
14impl InfoTrait for Cores {
15    fn get() -> Result<Self, Box<dyn Error>> {
16        let _ = is_linux()?;
17        let mut cores = Cores::default();
18        fs::read_to_string("/proc/stat")?.split('\n').for_each(|i| {
19            let fields: Vec<&str> = i.split_whitespace().collect();
20            if fields.len() > 5 {
21                if fields[0].contains("cpu") {
22                    let user_time = fields[1].trim().parse::<u64>().unwrap();
23                    let nice_time = fields[2].trim().parse::<u64>().unwrap();
24                    let system_time = fields[3].trim().parse::<u64>().unwrap();
25                    let idle_time = fields[4].trim().parse::<u64>().unwrap();
26
27                    let total_time = user_time + nice_time + system_time + idle_time;
28                    cores.0.push(Core {
29                        name: Some(fields[0].to_string()),
30                        usage: Some(100 - (idle_time * 100 / total_time)),
31                    });
32                }
33            }
34        });
35
36        Ok(cores)
37    }
38}