Guest User

Untitled

a guest
Jan 17th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.59 KB | None | 0 0
  1. use std::{
  2. fmt,
  3. fs::File,
  4. collections::HashMap,
  5. io::{self, Read},
  6. };
  7.  
  8. pub struct CPUInfo {
  9. pub model_name: String,
  10. pub cores: u16,
  11. }
  12.  
  13. #[derive(Debug)]
  14. pub enum Error {
  15. UnsupportedSystem,
  16. //ExecFailed(io::Error),
  17. IO(io::Error),
  18. Unknown,
  19. }
  20.  
  21.  
  22. impl fmt::Display for Error {
  23. fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
  24. use self::Error::*;
  25. match *self {
  26. UnsupportedSystem => write!(fmt, "System is not supported"),
  27. //ExecFailed(ref e) => write!(fmt, "Execution failed: {}", e),
  28. IO(ref e) => write!(fmt, "IO error: {}", e),
  29. Unknown => write!(fmt, "An unknown error occurred"),
  30. }
  31. }
  32. }
  33.  
  34. impl std::error::Error for Error {
  35. fn description(&self) -> &str {
  36. use self::Error::*;
  37. match *self {
  38. UnsupportedSystem => "unsupported system",
  39. //ExecFailed(_) => "execution failed",
  40. IO(_) => "io error",
  41. Unknown => "unknown error",
  42. }
  43. }
  44.  
  45. fn cause(&self) -> Option<&std::error::Error> {
  46. use self::Error::*;
  47. match *self {
  48. UnsupportedSystem => None,
  49. //ExecFailed(ref e) => Some(e),
  50. IO(ref e) => Some(e),
  51. Unknown => None,
  52. }
  53. }
  54. }
  55.  
  56. impl From<io::Error> for Error {
  57. fn from(e: io::Error) -> Error {
  58. Error::IO(e)
  59. }
  60. }
  61.  
  62. pub fn get_cpu() -> Result<CPUInfo, Error> {
  63. if cfg!(target_os = "linux") {
  64. let mut s = String::new();
  65. File::open("/proc/cpuinfo")?.read_to_string(&mut s)?;
  66. let mut cpuinfo_hashmap = HashMap::new();
  67. for line in s.lines() {
  68. let mut split_line = line.split_whitespace();
  69. let label = split_line.next();
  70. let value = split_line.next();
  71. if value.is_some() && label.is_some() {
  72. let label = label.unwrap().split(':').nth(0).ok_or(Error::Unknown)?;
  73. let value = value.unwrap().to_string();
  74. cpuinfo_hashmap.insert(label, value.to_string());
  75. }
  76. }
  77.  
  78. Ok(CPUInfo {
  79. model_name: {
  80. let m = cpuinfo_hashmap.get("model name").ok_or(Error::Unknown)?;
  81. m.to_string()
  82. },
  83. cores: {
  84. let c = cpuinfo_hashmap.get("siblings").ok_or(Error::Unknown)?;
  85. let cores: u16 = c.parse::<u16>().unwrap();
  86. cores
  87. },
  88. })
  89. } else {
  90. Err(Error::UnsupportedSystem)
  91. }
  92. }
  93.  
  94. fn main() {
  95. let cpu = get_cpu().expect("error getting cpu");
  96. println!("CPU: {} {}", cpu.model_name, cpu.cores)
  97. }
Add Comment
Please, Sign In to add comment