You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
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}")
|