hw_linux/cpu/
mod.rs

1use crate::{is_linux, InfoTrait};
2use std::error::Error;
3use std::fs;
4
5pub mod cores;
6
7#[derive(Default, Clone, Debug)]
8pub struct CpuInfo {
9    pub name: Option<String>,
10    pub vendor: Option<String>,
11    pub cores: Option<usize>,
12    pub threads: Option<usize>,
13    pub cache: Option<f64>,
14    pub min_freq: Option<f64>,
15    pub cur_freq: Option<f64>,
16    pub max_freq: Option<f64>,
17    pub temp: Option<f64>,
18}
19
20impl InfoTrait for CpuInfo {
21    fn get() -> Result<Self, Box<dyn Error>> {
22        let _ = is_linux()?;
23        let mut cpu = Self::default();
24        fs::read_to_string("/proc/cpuinfo")?
25            .split('\n')
26            .for_each(|i| {
27                let inf = i.split(':').collect::<Vec<&str>>();
28                if inf.len() > 1 {
29                    let key = inf[0].trim();
30                    let val = inf[1]
31                        .replace("kB", "")
32                        .replace("KB", "")
33                        .replace("\n", "")
34                        .trim()
35                        .to_string();
36
37                    match key {
38                        "model name" => {
39                            cpu.name = Some(val);
40                        }
41                        "vendor_id" => {
42                            cpu.vendor = Some(val);
43                        }
44                        "cpu cores" => {
45                            cpu.cores = match val.parse::<usize>() {
46                                Ok(x) => Some(x),
47                                Err(_) => None,
48                            }
49                        }
50                        "siblings" => {
51                            cpu.threads = match val.parse::<usize>() {
52                                Ok(x) => Some(x),
53                                Err(_) => None,
54                            }
55                        }
56                        "cache size" => {
57                            cpu.cache = match val.parse::<f64>() {
58                                Ok(x) => Some(x),
59                                Err(_) => None,
60                            }
61                        }
62                        "cpu MHz" => {
63                            cpu.cur_freq = match val.parse::<f64>() {
64                                Ok(x) => Some(x),
65                                Err(_) => None,
66                            }
67                        }
68                        &_ => (),
69                    }
70                }
71            });
72
73        cpu.min_freq = Some(
74            fs::read_to_string("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq")?
75                .trim()
76                .parse::<f64>()?
77                / 1000_f64,
78        );
79        cpu.max_freq = Some(
80            fs::read_to_string("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq")?
81                .trim()
82                .parse::<f64>()?
83                / 1000_f64,
84        );
85        cpu.temp = Some(
86            fs::read_to_string("/sys/class/thermal/thermal_zone10/temp")?
87                .trim()
88                .parse::<f64>()?
89                / 1000_f64,
90        );
91        Ok(cpu)
92    }
93}