use pest::Parser; use pest_derive::Parser; use pest_typed_tree::TypedTree; #[derive(Parser, TypedTree)] #[grammar = "../tests/complex.pest"] struct P; impl<'i> nodes::Num<'i> { fn value(&self) -> u64 { self.text().parse().unwrap() } } #[test] fn test() { let data = " CONST foo 7 SUM foofoo 3 2 CONST bar 7 SUM foobar 34 45 CONST_OPT quux 57 "; let root_pair = P::parse(Rule::program, data) .map_err(|e| println!("{}", e.to_string())) .expect("parse failed") .next() .unwrap(); let root_node = nodes::Program::new(root_pair); assert_eq!(root_node.text(), data); let mut sum = 0; for def in root_node.list_definition() { match def.to_enum() { nodes::DefinitionChildren::DefConst(def_const) => { sum += def_const.get_num().value(); } nodes::DefinitionChildren::DefSum(def_sum) => { sum += def_sum.get_first_num().value(); sum += def_sum.get_second_num().value() * 2; } nodes::DefinitionChildren::DefOpt(def_opt) => { sum += def_opt.get_num().map(|num| num.value()).unwrap_or(0); } } } assert_eq!(sum, 7 + 7 + 7 + 124 + 57); }