#[derive(Debug, Clone, PartialEq, Eq)]
#[repr(u8)]
pub enum TokenType<'a> {
Note(&'a str),
Sharp,
Flat,
Aug,
Dim,
Dim7,
HalfDim,
Extension(u8),
Add,
Omit,
Alt,
Sus,
Minor,
Hyphen,
Maj,
Maj7,
Slash,
LParent,
RParent,
Comma,
Bass,
Illegal,
Eof,
}
impl<'a> TokenType<'a> {
pub fn from_string(i: &'_ str) -> Option<TokenType<'_>> {
match i {
"BASS" | "Bass" | "bass" => Some(TokenType::Bass),
"MAJ" | "Maj" | "maj" | "MAJOR" | "Major" | "major" | "MA" | "Ma" | "ma" | "M" => {
Some(TokenType::Maj)
}
"MIN" | "Min" | "min" | "MINOR" | "Minor" | "minor" | "MI" | "Mi" | "mi" | "m" => {
Some(TokenType::Minor)
}
"b" => Some(TokenType::Flat),
"SUS" | "Sus" | "sus" => Some(TokenType::Sus),
"DIM" | "Dim" | "dim" | "diminished" => Some(TokenType::Dim),
"ALT" | "Alt" | "alt" => Some(TokenType::Alt),
"AUG" | "Aug" | "aug" => Some(TokenType::Aug),
"ADD" | "Add" | "add" => Some(TokenType::Add),
"O" | "o" | "°" => Some(TokenType::Dim),
"OMIT" | "Omit" | "omit" | "NO" | "No" | "no" => Some(TokenType::Omit),
"A" | "B" | "C" | "D" | "E" | "F" | "G" => Some(TokenType::Note(i)),
_ => None,
}
}
}
impl<'a> Display for TokenType<'a> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
TokenType::Note(note) => f.write_str(note)?,
TokenType::Sharp => f.write_str("#")?,
TokenType::Flat => f.write_str("b")?,
TokenType::Aug => f.write_str("+")?,
TokenType::Dim => f.write_str("°")?,
TokenType::Dim7 => f.write_str("°7")?,
TokenType::HalfDim => f.write_str("ø")?,
TokenType::Extension(ext) => f.write_str(&ext.to_string())?,
TokenType::Add => f.write_str("Add")?,
TokenType::Sus => f.write_str("Sus")?,
TokenType::Minor => f.write_str("-")?,
TokenType::Hyphen => f.write_str("-")?,
TokenType::Maj => f.write_str("△")?,
TokenType::Maj7 => f.write_str("△")?,
TokenType::Slash => f.write_str("/")?,
TokenType::Alt => f.write_str("Alt")?,
TokenType::Illegal => f.write_str("ILLEGAL")?,
TokenType::Eof => f.write_str("EOF")?,
TokenType::LParent => f.write_str("(")?,
TokenType::RParent => f.write_str(")")?,
TokenType::Omit => f.write_str("Omit")?,
TokenType::Comma => f.write_str(",")?,
TokenType::Bass => f.write_str("Bass")?,
}
Ok(())
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Token<'a> {
pub token_type: TokenType<'a>,
pub pos: usize,
pub len: usize,
pub synthetic: bool,
}
impl<'a> Token<'a> {
pub fn new(token_type: TokenType, pos: usize, len: usize) -> Token {
Token {
token_type,
pos,
len,
synthetic: false,
}
}
}
use std::fmt::Display;
impl<'a> Display for Token<'a> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&format!("{}", self.token_type))?;
Ok(())
}
}