1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use std::fs;
#[derive(Debug, Default)]
pub struct CpuInfo {
pub cache_size: usize,
pub cores: usize,
pub cpu_mhz: f32,
pub model_name: String,
pub vendor_id: String,
pub is_fpu: bool,
pub cpuid_level: f32,
}
fn parse_str(data: &str) -> &str {
data.split(":").nth(1).unwrap().trim()
}
impl CpuInfo {
pub fn new() -> Self {
let mut cpu_info = CpuInfo::default();
cpu_info.fetch();
cpu_info
}
pub fn fetch(&mut self) {
let raw_data =
fs::read_to_string("/proc/cpuinfo").expect("unable to read from cpuinfo file");
let data: Vec<&str> = raw_data.lines().collect();
let vendor_id = parse_str(data[1]).to_string();
let model_name = parse_str(data[4]).to_string();
let cpuid_level = parse_str(data[21]).parse::<f32>().unwrap();
let cpu_cores = parse_str(data[12]).parse::<usize>().unwrap();
let cache_size = parse_str(data[10])
.trim_end_matches("KB")
.trim()
.parse::<usize>()
.unwrap();
let cpu_mhz = parse_str(data[7]).parse::<f32>().unwrap();
let is_fpu = if parse_str(data[15]) == "yes" {
true
} else {
false
};
self.vendor_id = vendor_id;
self.model_name = model_name;
self.cpuid_level = cpuid_level;
self.cores = cpu_cores;
self.cache_size = cache_size;
self.cpu_mhz = cpu_mhz;
self.is_fpu = is_fpu;
}
}