using NubLang.Diagnostics;

namespace NubLang.Syntax;

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(SourceSpan Span);

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

public record IntLiteralToken(SourceSpan Span, string Value, int Base) : Token(Span);

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

public record BoolLiteralToken(SourceSpan Span, bool Value) : Token(Span);

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

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