rue-parser 0.8.4

A parser for the Rue programming language.
Documentation
use crate::{Parser, SyntaxKind, T};

pub fn binding(p: &mut Parser) {
    if p.at(SyntaxKind::Ident) {
        p.start(SyntaxKind::NamedBinding);
        p.expect(SyntaxKind::Ident);
        p.finish();
    } else if p.at(T!['(']) {
        p.start(SyntaxKind::PairBinding);
        p.expect(T!['(']);
        binding(p);
        p.expect(T![,]);
        binding(p);
        p.try_eat(T![,]);
        p.expect(T![')']);
        p.finish();
    } else if p.at(T!['[']) {
        p.start(SyntaxKind::ListBinding);
        p.expect(T!['[']);
        while !p.at(T![']']) {
            p.start(SyntaxKind::ListBindingItem);
            p.try_eat(T![...]);
            binding(p);
            p.finish();
            if !p.try_eat(T![,]) {
                break;
            }
        }
        p.expect(T![']']);
        p.finish();
    } else if p.at(T!['{']) {
        p.start(SyntaxKind::StructBinding);
        p.expect(T!['{']);
        while !p.at(T!['}']) {
            p.start(SyntaxKind::StructFieldBinding);
            let spread = p.try_eat(T![...]);
            p.expect(SyntaxKind::Ident);
            if p.try_eat(T![:]) && !spread {
                binding(p);
            }
            p.finish();
            if !p.try_eat(T![,]) {
                break;
            }
        }
        p.expect(T!['}']);
        p.finish();
    } else {
        p.skip();
    }
}