using NubLang.Code;

namespace NubLang.Tokenization;

public enum LiteralKind
{
    Integer,
    Hex,
    Binary,
    Float,
    String,
    Bool
}

public enum Symbol
{
    Func,
    Return,
    If,
    Else,
    While,
    Break,
    Continue,
    Colon,
    DoubleColon,
    OpenParen,
    CloseParen,
    OpenBrace,
    CloseBrace,
    OpenBracket,
    CloseBracket,
    Comma,
    Period,
    Assign,
    Bang,
    Equal,
    NotEqual,
    LessThan,
    LessThanOrEqual,
    GreaterThan,
    GreaterThanOrEqual,
    Plus,
    Minus,
    Star,
    ForwardSlash,
    Struct,
    Caret,
    Ampersand,
    Let,
    Calls,
    For,
    In,
    Extern,
    Semi,
    Percent,
    LeftShift,
    RightShift,
    Pipe,
    And,
    Or,
    Module,
    Import,
    Export,
    Defer,
    At,
}

public abstract record Token(string FileName, SourceSpan Span);

public record IdentifierToken(string FileName, SourceSpan Span, string Value) : Token(FileName, Span);

public record LiteralToken(string FileName, SourceSpan Span, LiteralKind Kind, string Value) : Token(FileName, Span);

public record SymbolToken(string FileName, SourceSpan Span, Symbol Symbol) : Token(FileName, Span);