melobot.typ._enum 源代码

from __future__ import annotations

from enum import Enum
from logging import CRITICAL, DEBUG, ERROR, INFO, WARNING

from typing_extensions import Any, Callable, Literal, TypeAlias, assert_never, cast, overload


class ExitCode(Enum):
    NORMAL = 0
    ERROR = 1
    RESTART = 2


# TODO: 考虑在最低支持 3.11 后,使用 logging.getLevelNamesMapping 兼容部分场景
[文档] class LogLevel(int, Enum): """日志等级枚举""" CRITICAL = CRITICAL ERROR = ERROR WARNING = WARNING INFO = INFO DEBUG = DEBUG
[文档] class LogicMode(Enum): """逻辑模式枚举类型""" AND = "and" OR = "or" NOT = "not" XOR = "xor"
[文档] def get_operator(self) -> Callable[[Any, Any], bool]: match self: case LogicMode.AND: return lambda x, y: x and y case LogicMode.OR: return lambda x, y: x or y case LogicMode.NOT: return lambda x, _: not x case LogicMode.XOR: return lambda x, y: x ^ y case _: assert_never(f"不正确的逻辑类型 {self}")
CommonColorType: TypeAlias = Literal[ # 标准色 (Standard, 0-7) "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white", # 以此类推的高亮色 (Bright/High Intensity, 8-15) "bright_black", "bright_red", "bright_green", "bright_yellow", "bright_blue", "bright_magenta", "bright_cyan", "bright_white", # 复位 "reset", ] CommonColors = ( "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white", "bright_black", "bright_red", "bright_green", "bright_yellow", "bright_blue", "bright_magenta", "bright_cyan", "bright_white", "reset", )
[文档] class Color: """颜色表示类""" @overload def __init__(self, arg1: CommonColorType | str) -> None: ... @overload def __init__(self, arg1: int, arg2: int, arg3: int) -> None: ...
[文档] def __init__( self, arg1: CommonColorType | str | int, arg2: int | None = None, arg3: int | None = None ) -> None: """三种初始化模式: 1. 通过常用颜色名称字符串初始化,例如 "red"、"bright_blue" 等。 2. 通过十六进制颜色字符串初始化,例如 "#ff0000" 3. 通过 RGB 三参数初始化,例如 255, 0, 0 :param arg1: 第一参数,可以是常用颜色名称字符串、十六进制颜色字符串,或者 RGB 的 R 分量整数 :param arg2: 第二参数,如果 arg1 是 RGB 的 R 分量,则 arg2 是 G 分量整数,否则为 None :param arg3: 第三参数,如果 arg1 是 RGB 的 R 分量,则 arg3 是 B 分量整数,否则为 None """ if isinstance(arg1, str): if arg1 in CommonColors: self.is_common = True return else: if not arg1.startswith("#"): raise ValueError("十六进制颜色值必须以'#'开头") hex_s = arg1.lstrip("#") if not (0 <= int(hex_s, 16) <= 0xFFFFFF): raise ValueError("十六进制颜色值必须在 #000000 到 #FFFFFF 之间") self.rgb = cast( tuple[int, int, int], tuple(int(hex_s[i : i + 2], 16) for i in (0, 2, 4)) ) self.is_common = False else: r, g, b = arg1, cast(int, arg2), cast(int, arg3) if not all(0 <= x <= 255 for x in (r, g, b)): raise ValueError(f"RGB 值必须都在 [0, 255] 之间,但是提供了 {arg1}, {arg2}, {arg3}") self.rgb = (r, g, b) self.is_common = False
@property def hex(self) -> str: if self.is_common: raise AttributeError("常用颜色没有十六进制表示") return f"#{self.rgb[0]:02x}{self.rgb[1]:02x}{self.rgb[2]:02x}" @property def hsl(self) -> tuple[float, float, float]: if self.is_common: raise AttributeError("常用颜色没有 HSL 表示") r, g, b = self.rgb[0] / 255.0, self.rgb[1] / 255.0, self.rgb[2] / 255.0 c_max = max(r, g, b) c_min = min(r, g, b) delta = c_max - c_min li = (c_max + c_min) / 2 if delta == 0: h, s = 0.0, 0.0 else: s = delta / (1 - abs(2 * li - 1)) if c_max == r: h = ((g - b) / delta) % 6 elif c_max == g: h = (b - r) / delta + 2 else: # c_max == b h = (r - g) / delta + 4 h *= 60 return (h, s * 100, li * 100) def __getattribute__(self, name: str) -> Any: if name in CommonColors: raise AttributeError("不能在实例上获取常用颜色枚举,请使用类对象") return super().__getattribute__(name) black: Color red: Color green: Color yellow: Color blue: Color magenta: Color cyan: Color white: Color bright_black: Color bright_red: Color bright_green: Color bright_yellow: Color bright_blue: Color bright_magenta: Color bright_cyan: Color bright_white: Color reset: Color
setattr(Color, "black", Color("black")) setattr(Color, "red", Color("red")) setattr(Color, "green", Color("green")) setattr(Color, "yellow", Color("yellow")) setattr(Color, "blue", Color("blue")) setattr(Color, "magenta", Color("magenta")) setattr(Color, "cyan", Color("cyan")) setattr(Color, "white", Color("white")) setattr(Color, "bright_black", Color("bright_black")) setattr(Color, "bright_red", Color("bright_red")) setattr(Color, "bright_green", Color("bright_green")) setattr(Color, "bright_yellow", Color("bright_yellow")) setattr(Color, "bright_blue", Color("bright_blue")) setattr(Color, "bright_magenta", Color("bright_magenta")) setattr(Color, "bright_cyan", Color("bright_cyan")) setattr(Color, "bright_white", Color("bright_white")) setattr(Color, "reset", Color("reset"))