use std::fmt;
#[derive(Debug, Clone, PartialEq)]
pub struct Token {
pub ty: TokenType,
pub value: String,
pub line: usize,
pub column: usize,
}
impl Token {
pub fn new(ty: TokenType, value: impl Into<String>, line: usize, column: usize) -> Self {
Token {
ty,
value: value.into(),
line,
column,
}
}
pub fn synthetic(ty: TokenType, line: usize, column: usize) -> Self {
Token {
ty,
value: String::new(),
line,
column,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum TokenType {
Version,
Workflow,
Run,
If,
Not,
While,
ParAnd,
Exec,
Harness,
Prompt,
PromptFile,
Args,
FailPolicy,
Match,
Else,
Name,
Number,
Str,
BareValue,
Colon,
Arrow,
Indent,
Dedent,
Newline,
Eof,
}
impl fmt::Display for TokenType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
TokenType::Version => write!(f, "version"),
TokenType::Workflow => write!(f, "workflow"),
TokenType::Run => write!(f, "run"),
TokenType::If => write!(f, "if"),
TokenType::Not => write!(f, "not"),
TokenType::While => write!(f, "while"),
TokenType::ParAnd => write!(f, "par-and"),
TokenType::Exec => write!(f, "exec"),
TokenType::Harness => write!(f, "harness"),
TokenType::Prompt => write!(f, "prompt"),
TokenType::PromptFile => write!(f, "prompt_file"),
TokenType::Args => write!(f, "args"),
TokenType::FailPolicy => write!(f, "fail-policy"),
TokenType::Match => write!(f, "match"),
TokenType::Else => write!(f, "else"),
TokenType::Name => write!(f, "name"),
TokenType::Number => write!(f, "number"),
TokenType::Str => write!(f, "string"),
TokenType::BareValue => write!(f, "bare value"),
TokenType::Colon => write!(f, ":"),
TokenType::Arrow => write!(f, "->"),
TokenType::Indent => write!(f, "INDENT"),
TokenType::Dedent => write!(f, "DEDENT"),
TokenType::Newline => write!(f, "NEWLINE"),
TokenType::Eof => write!(f, "EOF"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_token_type_display() {
assert_eq!(format!("{}", TokenType::Version), "version");
assert_eq!(format!("{}", TokenType::ParAnd), "par-and");
assert_eq!(format!("{}", TokenType::Eof), "EOF");
}
#[test]
fn test_token_creation() {
let tok = Token {
ty: TokenType::Workflow,
value: "workflow".to_string(),
line: 1,
column: 1,
};
assert_eq!(tok.ty, TokenType::Workflow);
assert_eq!(tok.line, 1);
}
}