use logos::Logos;

#[derive(Logos, Debug, PartialEq)]
#[logos(skip r"[ \t\n\f]+")] // Ignore this regex pattern between tokens
enum Token {
    #[token("{")]
    LeftBrace,

    #[token("}")]
    RightBrace,

    #[token("(")]
    LeftParen,

    #[token(")")]
    RightParen,

    #[token(";")]
    Semicolon,

    #[token(":")]
    Colon,

    #[token("<")]
    LeftArrow,

    #[token(">")]
    RightArrow,

    #[token(",")]
    Comma,

    #[token("=")]
    Equals,

    #[regex(r#"[A-z]+"#, |lex| lex.slice().parse().ok())]
    Literal(String),

    #[regex("use [a-zA-Z/]+;", |lex| lex.slice().parse().ok())]
    Component(String),

    #[regex("U[0-9]+", |lex| lex.slice().parse().ok())]
    UnsignedType(String),

    #[regex("I[0-9]+", |lex| lex.slice().parse().ok())]
    SignedType(String),

    #[regex(r"//[ a-zA-Z!-+]+", |lex| lex.slice().parse().ok())]
    Comment(String),
}

fn main() {
    let mut lex = Token::lexer(include_str!("../../../programs/aidl/assets/vfs.idl"));

    for token in lex {
        // let ok_token = token.ok();
        // if ok_token.is_some() {
        //     println!("{:?}", ok_token.unwrap());
        // }
        println!("{:?}", token);
    }
}