Source code for app.lib.serializers

from __future__ import annotations

from typing import (
    TYPE_CHECKING,
    Any,
)

from cashews.serialize import register_type
from msgspec import msgpack

from app.domain.users.schemas import UserAuth

if TYPE_CHECKING:
    from collections.abc import Awaitable, Callable


[docs] class MsgSpecRegistry: """Registry for msgspec-based serialization.""" _ENCODER = msgpack.Encoder() """Internal msgpack encoder instance."""
[docs] @classmethod def get_cashews_pair( cls, target_type: Any, ) -> tuple[ Callable[[Any, Any, Any], Awaitable[bytes]], Callable[[bytes, Any, Any], Awaitable[Any]], ]: """Create an asynchronous encoder/decoder pair for a specific type.""" decoder = msgpack.Decoder(target_type) async def _enc(value: Any, *args: Any, **kwargs: Any) -> bytes: """Encode a value to msgpack bytes.""" return cls._ENCODER.encode(value) async def _dec(value: bytes, *args: Any, **kwargs: Any) -> Any: """Decode msgpack bytes back to the target type.""" return decoder.decode(value) return _enc, _dec
[docs] def cashews_registry() -> None: """Register domain data models with the cashews serialization system.""" types_to_register = (UserAuth,) for model_type in types_to_register: encoder, decoder = MsgSpecRegistry.get_cashews_pair(model_type) register_type(klass=model_type, encoder=encoder, decoder=decoder)