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.
iTi-Flask/iti/mq/serialization.py

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}")