swiftlet 0.1.5

swiftlet is a high-performance text-parsing library for Rust, inspired by Python’s Lark.
Documentation
use std::sync::Arc;
use swiftlet::preclude::*;

const GRAMMAR: &str = r#"
start: request

request: get_request
    | post_request

get_request: request_line_get headers NEWLINE
post_request: request_line_post headers NEWLINE body?

request_line_get: "GET" SP REQUEST_TARGET SP HTTP_VERSION NEWLINE
request_line_post: "POST" SP REQUEST_TARGET SP HTTP_VERSION NEWLINE

headers: HEADER_LINE*
body: JSON_BODY

REQUEST_TARGET: /\/[^\r\n ]*/
HTTP_VERSION: /HTTP\/(1\.0|1\.1|2\.0)/
SP: " "
HEADER_LINE: /[A-Za-z][A-Za-z0-9-]*: [^\r\n]*\r?\n/
JSON_BODY: /\{[\s\S]*\}/
NEWLINE: /\r?\n/
"#;

fn main() {
    let parser_opt = Arc::new(
        ParserOption {
            algorithm: Algorithm::Earley,
            debug: false,
            ..Default::default()
        }
    );
    match Swiftlet::from_string(GRAMMAR, parser_opt) {
        Ok(parser) => {
            let texts = [
                "GET /users?id=42&active=true HTTP/1.1\r\nHost: example.com\r\nAccept: application/json\r\n\r\n",
                "POST /api/messages HTTP/1.1\r\nHost: example.com\r\nContent-Type: application/json\r\nContent-Length: 17\r\n\r\n{\"message\":\"hi\"}",
            ];
            let prefix_text = "HTTP request: ";
            texts.into_iter().for_each(|text| {
                println!("{}", "-".repeat(text.len() + prefix_text.len()));
                println!("{}{}", prefix_text, text);
                println!("{}", "-".repeat(text.len() + prefix_text.len()));
                let parsed = parser.parse(text);
                println!("AST =>");
                match parsed {
                    Ok(ast) => {
                        ast.pretty_print();
                        println!();
                    }
                    Err(err) => {
                        eprintln!("{err}");
                    }
                }
            });
        },
        Err(err) => {
            eprintln!("{}", err);
        }
    }
}