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}