use super::{Rule, impls::*};
use crate::parsing::token::{ExtractedToken, Token};
use enum_map::EnumMap;
use std::sync::LazyLock;
pub static RULE_MAP: LazyLock<EnumMap<Token, Vec<Rule>>> = LazyLock::new(|| {
enum_map! {
Token::LeftBracket => vec![RULE_LINK_SINGLE, RULE_TEXT],
Token::LeftBracketAnchor => vec![RULE_LINK_ANCHOR],
Token::LeftBracketStar => vec![RULE_LINK_SINGLE_NEW_TAB],
Token::RightBracket => vec![RULE_TEXT],
Token::LeftBlock => vec![RULE_BLOCK],
Token::LeftBlockEnd => vec![],
Token::LeftBlockAnchor => vec![RULE_ANCHOR],
Token::LeftBlockStar => vec![RULE_BLOCK_STAR],
Token::RightBlock => vec![],
Token::LeftParentheses => vec![RULE_BIBCITE, RULE_TEXT],
Token::RightParentheses => vec![RULE_BIBCITE, RULE_TEXT],
Token::LeftMath => vec![RULE_MATH],
Token::RightMath => vec![],
Token::DoubleDash => vec![RULE_STRIKETHROUGH_DASH, RULE_DASH],
Token::TripleDash => vec![RULE_HORIZONTAL_RULE],
Token::DoubleTilde => vec![RULE_STRIKETHROUGH_TILDE],
Token::LeftDoubleAngle => vec![RULE_DOUBLE_ANGLE],
Token::ClearFloatBoth => vec![RULE_CLEAR_FLOAT],
Token::ClearFloatLeft => vec![RULE_CLEAR_FLOAT],
Token::ClearFloatRight => vec![RULE_CLEAR_FLOAT],
Token::Pipe => vec![RULE_TEXT],
Token::Equals => vec![RULE_CENTER, RULE_TEXT],
Token::Colon => vec![RULE_DEFINITION_LIST, RULE_TEXT],
Token::Underscore => vec![RULE_UNDERSCORE_LINE_BREAK, RULE_TEXT],
Token::Quote => vec![RULE_BLOCKQUOTE, RULE_DOUBLE_ANGLE, RULE_TEXT],
Token::Heading => vec![RULE_HEADER, RULE_TEXT],
Token::Whitespace => vec![RULE_UNDERSCORE_LINE_BREAK, RULE_LIST, RULE_TEXT],
Token::Bold => vec![RULE_BOLD],
Token::Italics => vec![RULE_ITALICS],
Token::Underline => vec![RULE_UNDERLINE],
Token::Superscript => vec![RULE_SUPERSCRIPT],
Token::Subscript => vec![RULE_SUBSCRIPT],
Token::LeftMonospace => vec![RULE_MONOSPACE],
Token::RightMonospace => vec![],
Token::Color => vec![RULE_COLOR],
Token::Raw => vec![RULE_RAW],
Token::LeftRaw => vec![RULE_RAW],
Token::RightRaw => vec![],
Token::BulletItem => vec![RULE_LIST, RULE_TEXT],
Token::NumberedItem => vec![RULE_LIST, RULE_TEXT],
Token::LeftLink => vec![RULE_LINK_TRIPLE],
Token::LeftLinkStar => vec![RULE_LINK_TRIPLE_NEW_TAB],
Token::RightLink => vec![],
Token::TableColumn => vec![RULE_TABLE],
Token::TableColumnRight => vec![RULE_TABLE],
Token::TableColumnCenter => vec![RULE_TABLE],
Token::TableColumnTitle => vec![RULE_TABLE],
Token::Identifier => vec![RULE_TEXT],
Token::Email => vec![RULE_EMAIL],
Token::Url => vec![RULE_URL],
Token::Variable => vec![RULE_VARIABLE, RULE_TEXT],
Token::DoubleQuote => vec![RULE_TEXT],
Token::EscapedDoubleQuote => vec![RULE_TEXT],
Token::EscapedBackslash => vec![RULE_TEXT],
Token::LineBreak => vec![RULE_BLOCK_SKIP_NEWLINE, RULE_DEFINITION_LIST_SKIP_NEWLINE, RULE_LINE_BREAK],
Token::ParagraphBreak => vec![RULE_LINE_BREAK_PARAGRAPH],
Token::InputStart => vec![RULE_NULL],
Token::InputEnd => vec![RULE_NULL],
Token::LeftComment => vec![RULE_COMMENT],
Token::RightComment => vec![],
Token::Other => vec![RULE_TEXT],
}
});
#[inline]
pub fn get_rules_for_token(current: &ExtractedToken) -> &'static [Rule] {
&RULE_MAP[current.token]
}