1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//! Additional data stored within a [Token](super::Token),
//! external to its [TokenKind](super::token_type::TokenKind)
/// Additional data stored within a [Token](super::Token),
/// external to its [TokenKind](super::token_type::TokenKind)
#[derive(Clone, Debug, PartialEq)]
pub enum TokenData {
    /// [Token](super::Token) contains a [String]
    String(String),
    /// [Token](super::Token) contains a [character](char)
    Character(char),
    /// [Token](super::Token) contains an [integer](u128)
    Integer(u128),
    /// [Token](super::Token) contains a [float](f64)
    Float(f64),
    /// [Token](super::Token) contains no additional data
    None,
}
from! {
    value: String => Self::String(value),
    value: u128 => Self::Integer(value),
    value: f64 => Self::Float(value),
    value: char => Self::Character(value),
    _v:    () => Self::None,
}
/// Implements [From] for an enum
macro from($($value:ident: $src:ty => $dst:expr),*$(,)?) {
    $(impl From<$src> for TokenData {
        fn from($value: $src) -> Self { $dst }
    })*
}
impl std::fmt::Display for TokenData {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            TokenData::String(v) => write!(f, "\"{v}\""),
            TokenData::Character(v) => write!(f, "'{v}'"),
            TokenData::Integer(v) => v.fmt(f),
            TokenData::Float(v) => v.fmt(f),
            TokenData::None => "None".fmt(f),
        }
    }
}