extern crate peg; use std::collections::HashMap; peg::parser!( grammar keyval() for str { rule number() -> i64 = n:$(['0'..='9']+) { n.parse().unwrap() } pub rule keyvals() -> HashMap = kvs:keyval() ++ "\n" { kvs.iter().cloned().collect::>() } rule keyval() -> (i64, i64) = k:number() ":" + v:number() { (k, v) } }); fn main() { let mut expected = HashMap::new(); expected.insert(1, 3); expected.insert(2, 4); assert_eq!(keyval::keyvals("1:3\n2:4"), Ok(expected)); }