use std::fs;
use types::*;
pub fn iterate_processes_info() -> impl Iterator<Item = Result<ProcessInfo, Error>> {
fs::read_dir("/proc/")
.expect("Can't read /proc/")
.filter_map(|entry| {
let pid = entry.ok()?.file_name().to_str()?.parse::<u32>().ok()?;
let path = format!("/proc/{}/stat", pid);
let stat = match fs::read_to_string(&path) {
Result::Ok(stat) => stat,
Result::Err(err) => {
let description = format!("Can't read {}", path);
let internal_err = Error::internal_with_cause(description, &err);
return Option::Some(Result::Err(internal_err));
}
};
let mut parts_iter = stat.split_whitespace();
let name = parts_iter.nth(1)?;
let parent_pid = parts_iter.nth(1)?.parse::<u32>().ok()?;
let threads_count = parts_iter.nth(15)?.parse::<u32>().ok()?;
Option::Some(Result::Ok(ProcessInfo {
name: String::from(&name[1..name.len() - 1]),
pid,
parent_pid,
threads_count,
}))
})
}