confidence/flag_types.py (46 lines of code) (raw):
from __future__ import annotations
import sys
import typing
from dataclasses import dataclass, field
from confidence.errors import ErrorCode
if sys.version_info >= (3, 11):
# re-export needed for type checking
from enum import StrEnum as StrEnum # noqa: PLC0414
else:
from enum import Enum
class StrEnum(str, Enum):
"""
Backport StrEnum for Python <3.11
"""
pass
class FlagType(StrEnum):
BOOLEAN = "BOOLEAN"
STRING = "STRING"
OBJECT = "OBJECT"
FLOAT = "FLOAT"
INTEGER = "INTEGER"
class Reason(StrEnum):
CACHED = "CACHED"
DEFAULT = "DEFAULT"
DISABLED = "DISABLED"
ERROR = "ERROR"
STATIC = "STATIC"
SPLIT = "SPLIT"
TARGETING_MATCH = "TARGETING_MATCH"
UNKNOWN = "UNKNOWN"
FlagMetadata = typing.Mapping[str, typing.Any]
T_co = typing.TypeVar("T_co", covariant=True)
@dataclass
class FlagEvaluationDetails(typing.Generic[T_co]):
flag_key: str
value: T_co
variant: typing.Optional[str] = None
flag_metadata: FlagMetadata = field(default_factory=dict)
reason: typing.Optional[typing.Union[str, Reason]] = None
error_code: typing.Optional[ErrorCode] = None
error_message: typing.Optional[str] = None
U_co = typing.TypeVar("U_co", covariant=True)
@dataclass
class FlagResolutionDetails(typing.Generic[U_co]):
value: U_co
error_code: typing.Optional[ErrorCode] = None
error_message: typing.Optional[str] = None
reason: typing.Optional[typing.Union[str, Reason]] = None
variant: typing.Optional[str] = None
flag_metadata: FlagMetadata = field(default_factory=dict)