cli/
cli.rs

1extern crate ukhasnet_parser;
2use ukhasnet_parser::{Rdp, StringInput, Parser, ParserError};
3use std::env::args;
4
5fn main() {
6    let packet = if args().len() == 2 {
7        args().nth(1).unwrap()
8    } else {
9        "2bT12.34,15H38W123Z1:hello world[AG]".to_owned()
10    };
11    println!("Parsing '{}':", packet);
12
13    let mut parser = Rdp::new(StringInput::new(&packet));
14
15    match parser.packet() {
16        true => println!("Parsed OK:"),
17        false => {
18            let (expected, position) = parser.expected();
19
20            println!("Failure at input position {}", position);
21            println!("\n{}", packet);
22            for _ in 0..position { print!(" "); }
23            println!("^");
24
25            println!("Expected one of:");
26            println!("{:?}", expected);
27
28            let err = ParserError::from_parser(&mut parser);
29            println!("Error: {:?}", err);
30
31            panic!("Cannot proceed");
32        }
33    };
34
35    let mut indent = 0;
36    let mut parents = vec![&parser.queue()[0]];
37    let mut prev_t = parents[0];
38
39    for t in parser.queue() {
40        if t.start >= prev_t.start && t.end <= prev_t.end {
41            indent += 1;
42            parents.push(prev_t);
43        } else {
44            while t.start >= parents.last().unwrap().end {
45                parents.pop();
46                indent -= 1;
47            }
48        }
49        for _ in 0..(indent-1) {
50            print!("    ");
51        }
52        println!("{:?} {}-{}", t.rule, t.start, t.end);
53        prev_t = t;
54    }
55    println!("");
56
57    println!("{:?}", parser.parse());
58}