define_struct! {
pub struct LoadAvg {
one: f32,
five: f32,
fifteen: f32,
running_num: i64,
total_num: i64,
latest_pid: i32,
}
}
use std::str::FromStr;
impl FromStr for LoadAvg {
type Err = crate::ProcErr;
fn from_str(s: &str) -> Result<LoadAvg, crate::ProcErr> {
let columns: Vec<&str> = s.split(|c| c == ' ' || c == '/').collect();
if columns.len() != 6 {
let emsg = format!("LoadAvg has 5 fields but got {}", columns.len());
return Err(emsg.into())
}
let one = columns[0].parse::<f32>()?;
let five = columns[1].parse::<f32>()?;
let fifteen = columns[2].parse::<f32>()?;
let running_num = columns[3].parse::<i64>()?;
let total_num = columns[4].parse::<i64>()?;
let latest_pid = columns[5].parse::<i32>()?;
Ok(LoadAvg{
one, five, fifteen, running_num,
total_num, latest_pid
})
}
}
instance_impl! {
loadavg, "/proc/loadavg", LoadAvg
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_parse_loadavg() {
let source = "0.00 0.03 0.05 1/248 19480";
let correct = LoadAvg{
one: 0.00f32,
five: 0.03f32,
fifteen: 0.05f32,
running_num: 1,
total_num: 248,
latest_pid: 19480
};
assert_eq!(correct, source.parse().unwrap());
}
}