use std::sync::OnceLock;
use crate::Duo;
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum KindsRust {
Whitespace,
CommentLine,
CommentBlock,
Newline,
Keyword,
String,
Char,
Lifetime,
Operator,
Identifier,
Integer,
Float,
DoubleColon,
Semicolon,
OpenBrace,
CloseBrace,
OpenParen,
CloseParen,
OpenBracket,
CloseBracket,
Comma,
Hash,
Dot,
Colon,
Pipe,
OpenAngle,
CloseAngle,
Caret,
TempBorrow,
Question,
MacroExclamation,
}
pub fn duos_rust() -> &'static Vec<Duo<KindsRust>> {
static DUOS_RUST: OnceLock<Vec<Duo<KindsRust>>> = OnceLock::new();
DUOS_RUST.get_or_init(|| {vec![
Duo::new(KindsRust::Whitespace, r"^[^\S\n]+", false),
Duo::new(KindsRust::CommentLine, r"^//(.*)", false),
Duo::new(KindsRust::CommentBlock, r"^/\*(.|\n)*?\*/", false),
Duo::new(KindsRust::Newline, r"^\n", false),
Duo::new(
KindsRust::Keyword,
r"^(mut|let|if|else|fn|struct|enum|match|use|mod|pub|crate|impl|trait|for|while|loop|break|continue|return|as|const|static|type|where|unsafe|extern|ref|self|super|in|move|dyn|abstract|async|await|become|box|do|final|macro|override|priv|typeof|unsized|virtual|yield)\b",
true
),
Duo::new(KindsRust::String, r#"^"[^"]*""#, true),
Duo::new(KindsRust::Char, r"^'(.|\\n)'", true),
Duo::new(KindsRust::Lifetime, r"^'(?:[a-z_][a-z0-9_]*|static)\b", true),
Duo::new(KindsRust::Operator, r"^(=|\+|-|\*|/|%)", true),
Duo::new(KindsRust::Identifier, r"^[a-zA-Z_][a-zA-Z0-9_]*", true),
Duo::new(KindsRust::Integer, r"^\d+", true),
Duo::new(KindsRust::Float, r"^\d+\.\d+", true),
Duo::new(KindsRust::DoubleColon, r"^::", true),
Duo::new(KindsRust::Semicolon, r"^;", true),
Duo::new(KindsRust::OpenBrace, r"^\{", true),
Duo::new(KindsRust::CloseBrace, r"^\}", true),
Duo::new(KindsRust::OpenParen, r"^\(", true),
Duo::new(KindsRust::CloseParen, r"^\)", true),
Duo::new(KindsRust::OpenBracket, r"^\[", true),
Duo::new(KindsRust::CloseBracket, r"^\]", true),
Duo::new(KindsRust::Comma, r"^,", true),
Duo::new(KindsRust::Hash, r"^#", true),
Duo::new(KindsRust::Dot, r"^\.", true),
Duo::new(KindsRust::Colon, r"^:", true),
Duo::new(KindsRust::Pipe, r"^\|", true),
Duo::new(KindsRust::OpenAngle, r"^<", true),
Duo::new(KindsRust::CloseAngle, r"^>", true),
Duo::new(KindsRust::Caret, r"^\^", true),
Duo::new(KindsRust::TempBorrow, r"^&", true),
Duo::new(KindsRust::Question, r"^\?", true),
Duo::new(KindsRust::MacroExclamation, r"^!", true)
]})
}