# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Attributes in the C++ backend and associated metadata."""

from enum import Enum
from compiler.util import attribute_util


class Attribute(str, Enum):
    """Attributes available in the C++ backend."""
    NAMESPACE = "namespace"
    ENUM_CASE = "enum_case"


# Types associated with C++ backend attributes.
TYPES = {
    Attribute.NAMESPACE: attribute_util.STRING,
    Attribute.ENUM_CASE: attribute_util.STRING,
}


class Scope(set, Enum):
    """Allowed scopes for C++ backend attributes.

    Each entry is a set of (Attribute, default?) tuples, the first value being
    the attribute itself, the second value being a boolean value indicating
    whether the attribute is allowed to be defaulted in that scope."""
    BITS = {
        # Bits may contain an enum definition.
        (Attribute.ENUM_CASE, True)
    }
    ENUM = {
        (Attribute.ENUM_CASE, True),
    }
    ENUM_VALUE = {
        (Attribute.ENUM_CASE, False),
    }
    MODULE = {
        (Attribute.NAMESPACE, False),
        (Attribute.ENUM_CASE, True),
    },
    STRUCT = {
        # Struct may contain an enum definition.
        (Attribute.ENUM_CASE, True),
    }