from __future__ import annotations import json from typing import Any from .errors import MQConfigError SUPPORTED_VALUE_FORMATS = {"json", "bytes"} def encode_message_value(value: Any, value_format: str = "json") -> bytes | None: _validate_value_format(value_format) if value is None: return None if value_format == "bytes": if isinstance(value, bytes): return value raise TypeError("bytes mq value must be bytes") return json.dumps(value, ensure_ascii=False, separators=(",", ":")).encode("utf-8") def decode_message_value(value: bytes | None, value_format: str = "json") -> Any: _validate_value_format(value_format) if value is None: return None if value_format == "bytes": return value return json.loads(value.decode("utf-8")) def encode_message_key(key: str | bytes | None) -> bytes | None: if key is None or isinstance(key, bytes): return key return str(key).encode("utf-8") def decode_message_key(key: bytes | None) -> str | None: if key is None: return None return key.decode("utf-8") def _validate_value_format(value_format: str) -> None: if value_format not in SUPPORTED_VALUE_FORMATS: supported = ", ".join(sorted(SUPPORTED_VALUE_FORMATS)) raise MQConfigError(f"unsupported mq value_format: {value_format!r}, supported: {supported}")