use std::fs::File;
use std::io::Read;
use crate::error::{Error, Result};
use crate::utils::str_from_u8;
macro_rules! malformed {
() => {
Error::MalformedPressureFile
};
}
pub fn pressure_some_avg10(buf: &mut [u8]) -> Result<f32> {
let mut file = File::open("/proc/pressure/memory")?;
buf.fill(0);
let _ = file.read(buf)?;
let contents = str_from_u8(buf)?;
let line = contents.lines().next().ok_or(malformed!())?;
let mut words = line.split_ascii_whitespace();
if let Some(indicator) = words.next() {
if indicator == "some" {
let entry = words.next().ok_or(malformed!())?;
let equals_pos = entry.find('=').ok_or(malformed!())?;
let avg10 = entry.get(equals_pos + 1..).ok_or(malformed!())?;
let avg10: f32 = avg10.trim().parse()?;
return Ok(avg10);
}
}
Err(malformed!())
}