Source code for dolor.types.enum

"""Enumeration types."""

from .type import Type
from .util import prepare_types

[docs]class Enum(Type): r"""Matches values from other types to :class:`enum.Enum` values. The default value is the first member of the enum. Parameters ---------- elem_type : subclass of :class:`~.Type` The base type to use to get the raw values. enum_type : subclass of :class:`enum.Enum` The enum type to translate values gotten using ``elem_type``. Examples -------- >>> import enum >>> import dolor >>> class MyEnum(enum.Enum): ... A = 0 ... B = 1 ... >>> e = dolor.types.Enum(dolor.types.Byte, MyEnum) >>> e <class 'dolor.types.enum.ByteEnum(MyEnum)'> >>> e.default() <MyEnum.A: 0> >>> e.pack(MyEnum.B) b'\x01' >>> e.unpack(b"\x01") <MyEnum.B: 1> """ elem_type = None enum_type = None @classmethod def _default(cls, *, ctx=None): return tuple(cls.enum_type.__members__.values())[0] @classmethod def _unpack(cls, buf, *, ctx=None): return cls.enum_type(cls.elem_type.unpack(buf, ctx=ctx)) @classmethod def _pack(cls, value, *, ctx=None): return cls.elem_type.pack(value.value, ctx=ctx) @classmethod @prepare_types def _call(cls, elem_type: Type, enum_type): return cls.make_type(f"{elem_type.__name__}Enum({enum_type.__name__})", elem_type = elem_type, enum_type = enum_type, )