define_struct! {
pub struct IoMem {
start: usize,
end: usize,
kind: String,
}
}
use std::str::FromStr;
impl FromStr for IoMem {
type Err = crate::ProcErr;
fn from_str(s: &str) -> Result<IoMem, Self::Err> {
let items: Vec<&str> = s.splitn(3 ,|c| c == '-' || c == ':').map(|s| s.trim()).collect();
if items.len() != 3 {
return Err("require three items at least to parse iomem".into());
}
let start = usize::from_str_radix(items[0], 16)?;
let end = usize::from_str_radix(items[1], 16)?;
let kind = items[2].to_string();
Ok(IoMem { start, end, kind })
}
}
list_impl! {
iomem, "/proc/iomem", IoMem, '\n', 0
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_parse_iomem() {
let source = "009fc00-0009ffff : reserved";
let correct = IoMem {
start: 0x09fc00,
end: 0x0009ffff,
kind: "reserved".to_string()
};
assert_eq!(correct, source.parse::<IoMem>().unwrap());
}
}