define_struct!{
pub struct Partition {
major: usize,
minor: usize,
blocks: usize,
name: String,
}
}
use std::str::FromStr;
impl FromStr for Partition {
type Err = crate::ProcErr;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let columns: Vec<&str> = s.split_ascii_whitespace().collect();
if columns.len() != 4 {
return Err("partition should have 4 fields".into())
}
let major = columns[0].parse::<usize>()?;
let minor = columns[1].parse::<usize>()?;
let blocks = columns[2].parse::<usize>()?;
let name = columns[3].to_string();
Ok(Partition{
major, minor, blocks, name
})
}
}
list_impl!{
partitions, "/proc/partitions", Partition, '\n', 2
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_parse_partition() {
let source = "252 0 41943040 vda";
let correct = Partition{
major: 252,
minor: 0,
blocks: 41943040,
name: "vda".to_string()
};
assert_eq!(source.parse::<Partition>().unwrap(), correct)
}
}