ukhasnet-parser 0.4.0

A parser for the UKHASnet protocol
Documentation
extern crate ukhasnet_parser;
use ukhasnet_parser::{Rdp, StringInput, Parser, ParserError};
use std::env::args;

fn main() {
    let packet = if args().len() == 2 {
        args().nth(1).unwrap()
    } else {
        "2bT12.34,15H38W123Z1:hello world[AG]".to_owned()
    };
    println!("Parsing '{}':", packet);

    let mut parser = Rdp::new(StringInput::new(&packet));

    match parser.packet() {
        true => println!("Parsed OK:"),
        false => {
            let (expected, position) = parser.expected();

            println!("Failure at input position {}", position);
            println!("\n{}", packet);
            for _ in 0..position { print!(" "); }
            println!("^");

            println!("Expected one of:");
            println!("{:?}", expected);

            let err = ParserError::from_parser(&mut parser);
            println!("Error: {:?}", err);

            panic!("Cannot proceed");
        }
    };

    let mut indent = 0;
    let mut parents = vec![&parser.queue()[0]];
    let mut prev_t = parents[0];

    for t in parser.queue() {
        if t.start >= prev_t.start && t.end <= prev_t.end {
            indent += 1;
            parents.push(prev_t);
        } else {
            while t.start >= parents.last().unwrap().end {
                parents.pop();
                indent -= 1;
            }
        }
        for _ in 0..(indent-1) {
            print!("    ");
        }
        println!("{:?} {}-{}", t.rule, t.start, t.end);
        prev_t = t;
    }
    println!("");

    println!("{:?}", parser.parse());
}