Source code for vibeblocks.utils.serialization

import dataclasses
import json
import uuid
from datetime import date, datetime
from enum import Enum
from typing import Any


def _default_encoder(obj: Any) -> Any:
    if isinstance(obj, set):
        return list(obj)
    if isinstance(obj, Exception):
        return str(obj)
    if isinstance(obj, (datetime, date)):
        return obj.isoformat()
    if isinstance(obj, uuid.UUID):
        return str(obj)
    if isinstance(obj, Enum):
        return obj.value
    if dataclasses.is_dataclass(obj) and not isinstance(obj, type):
        return dataclasses.asdict(obj)
    if hasattr(obj, "__dict__"):
        return obj.__dict__

    # Let standard json encoder raise the error or handle basic types
    raise TypeError(f"Object of type {type(obj).__name__} is not JSON serializable")

[docs] def to_json(obj: Any, indent: int | None = 2) -> str: """Serializes an object to a JSON string using custom encoders.""" return json.dumps(obj, default=_default_encoder, indent=indent)
[docs] def from_json(json_str: str) -> Any: """Deserializes a JSON string to a dictionary/list structure.""" return json.loads(json_str)