1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
extern crate regex;
extern crate failure;

use std::io::BufReader;
use std::io::BufRead;
use std::io::Read;
use regex::Regex;
use std::collections::HashMap;
use failure::Error;

pub fn parse_mtd<R: Read> (r: R) -> Result<HashMap<String, u32>, Error> {
    let mut ret = HashMap::new();
    let re = Regex::new(r#"^mtd([0-9]*):[^"]*"([^"]*)""#)?;
    let reader = BufReader::new(r);
    for line in  reader.lines().skip(1) {
        if let Ok(line) = line {
            for cap in re.captures_iter(&line) {
                println!("{:?}", cap);
                ret.insert(cap[2].to_string(), cap[1].parse::<u32>().unwrap());
            }
        }
    }
    Ok(ret)
}


#[test]
fn example() {
let parts = br#"dev:    size   erasesize  name
mtd0: 00020000 00010000 "factory-boot"
mtd1: 00020000 00010000 "fs-uboot"
mtd2: 00a00000 00010000 "firmware"
mtd3: 00152ba1 00010000 "kernel"
mtd4: 008ad45f 00010000 "rootfs"
mtd5: 004c0000 00010000 "genesis"
mtd6: 00000200 00010000 "mac"
mtd7: 00000200 00010000 "pin"
mtd8: 00000100 00010000 "device-id"
mtd9: 0000fb00 00010000 "product-info"
mtd10: 000b0000 00010000 "sysconf"
mtd11: 00010000 00010000 "partition-table"
mtd12: 0000a000 00010000 "support-list"
mtd13: 00000100 00010000 "soft-version"
mtd14: 00001000 00010000 "extra-para"
mtd15: 00000400 00010000 "identity"
mtd16: 00010000 00010000 "art"
"#;
let r = parse_mtd(parts as &[u8]).unwrap();
assert!(r["device-id"] == 8);
assert!(r["identity"] == 15);
assert!(r["art"] == 16);
}