use std::fmt;
#[derive(Debug)]
#[cfg_attr(
feature = "unstable_machinery_serde",
derive(serde::Serialize),
serde(tag = "name", content = "payload")
)]
pub enum Token<'a> {
TemplateData(&'a str),
VariableStart,
VariableEnd,
BlockStart,
BlockEnd,
Ident(&'a str),
Str(&'a str),
String(String),
Int(i64),
Float(f64),
Plus,
Minus,
Mul,
Div,
FloorDiv,
Pow,
Mod,
Bang,
Dot,
Comma,
Colon,
Tilde,
Assign,
Pipe,
Eq,
Ne,
Gt,
Gte,
Lt,
Lte,
BracketOpen,
BracketClose,
ParenOpen,
ParenClose,
BraceOpen,
BraceClose,
}
impl<'a> fmt::Display for Token<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Token::TemplateData(_) => write!(f, "template-data"),
Token::VariableStart => write!(f, "start of variable block"),
Token::VariableEnd => write!(f, "end of variable block"),
Token::BlockStart => write!(f, "start of block"),
Token::BlockEnd => write!(f, "end of block"),
Token::Ident(_) => write!(f, "identifier"),
Token::Str(_) | Token::String(_) => write!(f, "string"),
Token::Int(_) => write!(f, "integer"),
Token::Float(_) => write!(f, "float"),
Token::Plus => write!(f, "`+`"),
Token::Minus => write!(f, "`-`"),
Token::Mul => write!(f, "`*`"),
Token::Div => write!(f, "`/`"),
Token::FloorDiv => write!(f, "`//`"),
Token::Pow => write!(f, "`**`"),
Token::Mod => write!(f, "`%`"),
Token::Bang => write!(f, "`!`"),
Token::Dot => write!(f, "`.`"),
Token::Comma => write!(f, "`,`"),
Token::Colon => write!(f, "`:`"),
Token::Tilde => write!(f, "`~`"),
Token::Assign => write!(f, "`=`"),
Token::Pipe => write!(f, "`|`"),
Token::Eq => write!(f, "`==`"),
Token::Ne => write!(f, "`!=`"),
Token::Gt => write!(f, "`>`"),
Token::Gte => write!(f, "`>=`"),
Token::Lt => write!(f, "`<`"),
Token::Lte => write!(f, "`<=`"),
Token::BracketOpen => write!(f, "`[`"),
Token::BracketClose => write!(f, "`]`"),
Token::ParenOpen => write!(f, "`(`"),
Token::ParenClose => write!(f, "`)`"),
Token::BraceOpen => write!(f, "`{{`"),
Token::BraceClose => write!(f, "`}}`"),
}
}
}
#[derive(Clone, Copy, Default, PartialEq, Eq)]
#[cfg_attr(feature = "unstable_machinery_serde", derive(serde::Serialize))]
pub struct Span {
pub start_line: u32,
pub start_col: u32,
pub end_line: u32,
pub end_col: u32,
}
impl fmt::Debug for Span {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
" @ {}:{}-{}:{}",
self.start_line, self.start_col, self.end_line, self.end_col
)
}
}