Coverage for src / taipanstack / utils / serialization.py: 100%
12 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-23 14:54 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-23 14:54 +0000
1"""
2Serialization utilities.
4Provides an optimized default encoder for use with ``orjson.dumps``.
5"""
7from taipanstack.core.result import Err, Ok
9__all__ = ["default_encoder"]
12def default_encoder(obj: object) -> dict[str, object]:
13 """Default encoder for orjson.dumps handling Result types.
15 Intercepts objects of type ``Ok`` and ``Err``:
16 - ``Ok(value)``: Returns ``{"status": "success"}`` merged with ``value`` if
17 ``value`` is a dict. Otherwise returns ``{"status": "success", "data": value}``.
18 - ``Err(error)``: Returns ``{"status": "error", "message": str(error)}``.
20 Args:
21 obj: The object to encode.
23 Returns:
24 A serializable representation of the object.
26 Raises:
27 TypeError: If the object type is not supported.
29 Example:
30 >>> import orjson
31 >>> orjson.dumps(Ok({"id": 1}), default=default_encoder)
32 b'{"status":"success","id":1}'
33 >>> orjson.dumps(Err(ValueError("oops")), default=default_encoder)
34 b'{"status":"error","message":"oops"}'
36 """
37 match obj:
38 case Ok(ok_value) if isinstance(ok_value, dict):
39 return {"status": "success", **ok_value}
40 case Ok(ok_value):
41 return {"status": "success", "data": ok_value}
42 case Err(err_value):
43 return {"status": "error", "message": str(err_value)}
44 case _:
45 raise TypeError(f"Type {type(obj).__name__} is not JSON serializable")