brack-tokenizer 0.1.0

The tokenizer for the Brack programming language
Documentation
use crate::{
    angle_bracket_close, angle_bracket_open, arguments, backslash, curly_bracket_close,
    curly_bracket_open, escape, identifier, module, newline, square_bracket_close,
    square_bracket_open,
    tokenizer::Tokenizer,
    tokens::{Location, LocationData, Token},
    utils::{separate, update_tokens},
};

pub fn dispatch(t: &Tokenizer) -> Vec<Token> {
    let s = t.untreated.clone().unwrap_or_default();
    let pool = t.pool.clone().unwrap_or_default();
    let column = t.column.unwrap_or_default();

    let (head, tail) = separate(&s);

    if head == "\0" {
        let mut updated = update_tokens(t, false);
        updated.push(Token::EOF(Location {
            start: LocationData {
                line: t.line.unwrap_or_default(),
                character: t.column.unwrap_or_default(),
            },
            end: LocationData {
                line: t.line.unwrap_or_default(),
                character: t.column.unwrap_or_default(),
            },
        }));
        return updated;
    }

    if t.escaped.unwrap_or_default() {
        return escape::tokenize(t);
    }

    let angle_c = t.angle_nest_count.unwrap_or_default();
    let curly_c = t.curly_nest_count.unwrap_or_default();
    let square_c = t.square_nest_count.unwrap_or_default();
    let look_for_ident = t.looking_for_identifier.unwrap_or_default();
    match &head[..] {
        "\\" => backslash::tokenize(t),
        "<" => angle_bracket_open::tokenize(t),
        ">" if angle_c > 0 => angle_bracket_close::tokenize(t),
        "{" => curly_bracket_open::tokenize(t),
        "}" if curly_c > 0 => curly_bracket_close::tokenize(t),
        "[" => square_bracket_open::tokenize(t),
        "]" if square_c > 0 => square_bracket_close::tokenize(t),
        "," if (angle_c + curly_c + square_c) > 0 => arguments::tokenize(t),
        " " if look_for_ident => identifier::tokenize(t),
        "." if look_for_ident => module::tokenize(t),
        "\n" => newline::tokenize(t),
        _ => {
            let t2 = Tokenizer {
                column: Some(column + 1),
                untreated: Some(tail),
                pool: Some(format!("{}{}", pool, head)),
                ..Default::default()
            };

            dispatch(&t.merge(&t2))
        }
    }
}