utf-railroad 1.1.0

Generate text railroad diagrams in rust.
Documentation
extern crate utf_railroad;

use utf_railroad::{Diagram, Choice, Terminal, Sequence, Repeat, Optional, NonTerminal};

fn main() {
    let object = Diagram::default()
        .push(Box::new(Terminal::new("{")))
        .push(Box::new(
            Optional::new(Box::new(
                Sequence::default()
                    .push(Box::new(
                        Repeat::new(Box::new(
                            Sequence::default()
                                .push(Box::new(NonTerminal::new("string")))
                                .push(Box::new(Terminal::new(":")))
                                .push(Box::new(NonTerminal::new("value")))
                                .push(Box::new(Terminal::new(",")))
                        ))
                    ))
                    .push(Box::new(
                        Sequence::default()
                            .push(Box::new(NonTerminal::new("string")))
                            .push(Box::new(Terminal::new(":")))
                            .push(Box::new(NonTerminal::new("value")))
                    ))
            ))
        ))
        .push(Box::new(Terminal::new("}")));
    println!("object:\n{}\n", object);

    let array = Diagram::default()
        .push(Box::new(Terminal::new("[")))
        .push(Box::new(
            Optional::new(Box::new(
                Sequence::default()
                    .push(Box::new(
                        Repeat::new(Box::new(
                            Sequence::default()
                                .push(Box::new(NonTerminal::new("value")))
                                .push(Box::new(Terminal::new(",")))
                        ))
                    ))
                    .push(Box::new(NonTerminal::new("value")))
            ))
        ))
        .push(Box::new(Terminal::new("]")));
    println!("array:\n{}\n", array);

    let value = Diagram::default()
        .push(Box::new(
            Choice::default()
                .push(Box::new(NonTerminal::new("string")))
                .push(Box::new(NonTerminal::new("number")))
                .push(Box::new(NonTerminal::new("object")))
                .push(Box::new(NonTerminal::new("array")))
                .push(Box::new(Terminal::new("true")))
                .push(Box::new(Terminal::new("false")))
                .push(Box::new(Terminal::new("null")))
        ));
    println!("value:\n{}\n", value);

    let string = Diagram::default()
        .push(Box::new(Terminal::new("\"")))
        .push(Box::new(
            Repeat::new(Box::new(
                Choice::default()
                    .push(Box::new(Terminal::new("Any unicode character except \" or \\ or control character")))
                    .push(Box::new(
                        Sequence::default()
                            .push(Box::new(Terminal::new("\\")))
                            .push(Box::new(
                                Choice::default()
                                    .push(Box::new(Terminal::new("\"")))
                                    .push(Box::new(Terminal::new("\\")))
                                    .push(Box::new(Terminal::new("/")))
                                    .push(Box::new(Terminal::new("b")))
                                    .push(Box::new(Terminal::new("f")))
                                    .push(Box::new(Terminal::new("n")))
                                    .push(Box::new(Terminal::new("r")))
                                    .push(Box::new(Terminal::new("t")))
                                    .push(Box::new(
                                        Sequence::default()
                                            .push(Box::new(Terminal::new("u")))
                                            .push(Box::new(
                                                Repeat::new(Box::new(Terminal::new("hexadecimal digit")))
                                                    .min(4)
                                                    .max(4)
                                            ))
                                    ))
                            ))
                    ))
                ))
        ))
        .push(Box::new(Terminal::new("\"")));
    println!("string:\n{}\n", string);

    let number = Diagram::default()
        .push(Box::new(Optional::new(Box::new(Terminal::new("-")))))
        .push(Box::new(
            Choice::default()
                .push(Box::new(Terminal::new("0")))
                .push(Box::new(
                    Sequence::default()
                        .push(Box::new(Terminal::new("digit 1-9")))
                        .push(Box::new(
                            Repeat::new(Box::new(Terminal::new("digit")))
                        ))
                ))
        ))
        .push(Box::new(
            Optional::new(Box::new(
                Sequence::default()
                    .push(Box::new(Terminal::new(".")))
                    .push(Box::new(
                        Repeat::new(Box::new(Terminal::new("digit")))
                            .min(1)
                    ))
            ))
        ))
        .push(Box::new(
            Optional::new(Box::new(
                Sequence::default()
                    .push(Box::new(
                        Choice::default()
                            .push(Box::new(Terminal::new("e")))
                            .push(Box::new(Terminal::new("E")))
                    ))
                    .push(Box::new(
                        Optional::new(Box::new(
                            Choice::default()
                                .push(Box::new(Terminal::new("+")))
                                .push(Box::new(Terminal::new("-")))
                        ))
                    ))
                    
                    .push(Box::new(
                        Repeat::new(Box::new(Terminal::new("digit")))
                            .min(1)
                    ))
            ))
        ));
    println!("number:\n{}", number);
}