use std::process::Command;
#[derive(Debug, Clone)]
pub struct SystemInfo {
pub cores: usize,
pub memory: String,
pub serial_number: String,
pub hardware_uuid: String,
}
impl SystemInfo {
pub fn new() -> Result<Self, String> {
let mut that = Self {
cores: 0,
memory: "".to_string(),
serial_number: "".to_string(),
hardware_uuid: "".to_string(),
};
#[cfg(target_os = "macos")]
return match that.mac_os() {
Ok(e) => Ok(e.clone()),
Err(e) => Err(e)
};
#[cfg(target_os = "windows")]
return match that.windows() {
Ok(e) => Ok(e.clone()),
Err(e) => Err(e)
};
Err("无信息".to_string())
}
pub fn mac_os(&mut self) -> Result<&mut Self, String> {
let output = match Command::new("system_profiler")
.args(&["SPHardwareDataType"])
.output() {
Ok(e) => e,
Err(e) => {
return Err(format!("{}", e.to_string()));
}
};
let serial_number = String::from_utf8_lossy(&output.stdout);
for line in serial_number.lines() {
let text = line.trim();
if text.contains("Total Number of Cores: ") {
self.cores = text.trim_start_matches("Total Number of Cores: ").parse::<usize>().unwrap();
}
if text.contains("Memory: ") {
self.memory = text.trim_start_matches("Memory: ").to_string();
}
if text.contains("Serial Number (system): ") {
self.serial_number = text.trim_start_matches("Serial Number (system): ").to_string();
}
if text.contains("Hardware UUID: ") {
self.hardware_uuid = text.trim_start_matches("Hardware UUID: ").to_string();
}
}
Ok(self)
}
pub fn windows(&mut self) -> Result<&mut Self, String> {
let output = match Command::new("wmic")
.args(&["diskdrive", "get", "SerialNumber"])
.output() {
Ok(e) => e,
Err(e) => {
return Err(format!("{}", e.to_string()));
}
};
let serial_number = String::from_utf8_lossy(&output.stdout);
println!("{}", serial_number);
Err("none".to_string())
}
}