"""
    pygments.lexers.bare
    ~~~~~~~~~~~~~~~~~~~~

    Lexer for the BARE schema.

    :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details.
"""

from pygments.lexer import RegexLexer, words, bygroups
from pygments.token import Text, Comment, Keyword, Name, Literal, Whitespace

__all__ = ["BareLexer"]


class BareLexer(RegexLexer):
    """
    For BARE schema source.

    .. versionadded:: 2.7
    """

    name = "BARE"
    url = "https://baremessages.org"
    filenames = ["*.bare"]
    aliases = ["bare"]

    keywords = [
        "type",
        "enum",
        "u8",
        "u16",
        "u32",
        "u64",
        "uint",
        "i8",
        "i16",
        "i32",
        "i64",
        "int",
        "f32",
        "f64",
        "bool",
        "void",
        "data",
        "string",
        "optional",
        "map",
    ]

    tokens = {
        "root": [
            (
                r"(type)(\s+)([A-Z][a-zA-Z0-9]+)(\s+)(\{)",
                bygroups(Keyword, Whitespace, Name.Class, Whitespace, Text),
                "struct",
            ),
            (
                r"(type)(\s+)([A-Z][a-zA-Z0-9]+)(\s+)(\()",
                bygroups(Keyword, Whitespace, Name.Class, Whitespace, Text),
                "union",
            ),
            (r"(type)(\s+)([A-Z][a-zA-Z0-9]+)(\s+)", bygroups(Keyword, Whitespace, Name, Whitespace), "typedef"),
            (r"(enum)(\s+)([A-Z][a-zA-Z0-9]+)(\s+\{)", bygroups(Keyword, Whitespace, Name.Class, Whitespace), "enum"),
            (r"#.*?$", Comment),
            (r"\s+", Whitespace),
        ],
        "struct": [
            (r"\{", Text, "#push"),
            (r"\}", Text, "#pop"),
            (r"([a-zA-Z0-9]+)(:)(\s*)", bygroups(Name.Attribute, Text, Whitespace), "typedef"),
            (r"\s+", Whitespace),
        ],
        "union": [
            (r"\)", Text, "#pop"),
            (r"(\s*)(\|)(\s*)", bygroups(Whitespace, Text, Whitespace)),
            (r"[A-Z][a-zA-Z0-9]+", Name.Class),
            (words(keywords), Keyword),
            (r"\s+", Whitespace),
        ],
        "typedef": [
            (r"\[\]", Text),
            (r"#.*?$", Comment, "#pop"),
            (r"(\[)(\d+)(\])", bygroups(Text, Literal, Text)),
            (r"<|>", Text),
            (r"\(", Text, "union"),
            (r"(\[)([a-z][a-z-A-Z0-9]+)(\])", bygroups(Text, Keyword, Text)),
            (r"(\[)([A-Z][a-z-A-Z0-9]+)(\])", bygroups(Text, Name.Class, Text)),
            (r"([A-Z][a-z-A-Z0-9]+)", Name.Class),
            (words(keywords), Keyword),
            (r"\n", Text, "#pop"),
            (r"\{", Text, "struct"),
            (r"\s+", Whitespace),
            (r"\d+", Literal),
        ],
        "enum": [
            (r"\{", Text, "#push"),
            (r"\}", Text, "#pop"),
            (r"([A-Z][A-Z0-9_]*)(\s*=\s*)(\d+)", bygroups(Name.Attribute, Text, Literal)),
            (r"([A-Z][A-Z0-9_]*)", bygroups(Name.Attribute)),
            (r"#.*?$", Comment),
            (r"\s+", Whitespace),
        ],
    }
