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}