use crate::opcode::Opcode;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Token {
PushData(Vec<u8>),
Op(Opcode),
}
impl std::fmt::Display for Token {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Token::PushData(data) => {
write!(f, "<")?;
for byte in data {
write!(f, "{byte:02x}")?;
}
write!(f, ">")
}
Token::Op(opcode) => write!(f, "{opcode}"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn display_push_data() {
let token = Token::PushData(vec![0x89, 0xab, 0xcd, 0xef]);
assert_eq!(format!("{token}"), "<89abcdef>");
}
#[test]
fn display_empty_push_data() {
let token = Token::PushData(vec![]);
assert_eq!(format!("{token}"), "<>");
}
#[test]
fn display_opcode() {
let token = Token::Op(Opcode::OpDup);
assert_eq!(format!("{token}"), "OP_DUP");
}
}