Source code for bytespec.codecs.enum

# Copyright (c) 2026 ink-developer

from enum import Enum
from typing import Any

from typing_extensions import override

from bytespec.codecs import ICodec
from bytespec.enums import ByteOrder
from bytespec.errors import DecodeError


[docs] class EnumCodec(ICodec[Enum]): """An enum encoded using a codec for its value. Args: enum_type: The enum class used to reconstruct members via enum_type(value). value_codec: The codec for .value, such as StrCodec or UInt8Codec. """ def __init__( self, enum_type: type[Enum], value_codec: ICodec[Any], ) -> None: self.enum_type = enum_type self.value_codec = value_codec @override def encode(self, value: Enum, byte_order: ByteOrder) -> bytes: """Write value.value using the selected value codec.""" return self.value_codec.encode(value.value, byte_order) @override def decode(self, buffer: bytes, byte_order: ByteOrder, offset: int) -> tuple[Enum, int]: """Read an enum member and return it with its absolute end offset. Raises: DecodeError: The decoded value is not an enum member, or the value codec rejected the data. """ value, end = self.value_codec.decode(buffer, byte_order, offset) try: decoded = self.enum_type(value) except ValueError as exc: raise DecodeError( f"EnumCodec ({self.enum_type.__name__}) at offset {offset}: invalid value {value!r}" ) from exc return decoded, end