import enum import attr from ..utils import json def bool2str(value: bool) -> str: """Return bool as str.""" if value: return '1' return '0' def encode(obj): if isinstance(obj, (list, tuple, set)): return [encode(x) for x in obj] elif issubclass(obj.__class__, enum.Enum): return obj.value elif isinstance(obj, dict): return {encode(k): encode(v) for k, v in obj.items() if v is not None} elif isinstance(obj, bool): return bool2str(obj) try: return encode(attr.asdict(obj)) except attr.exceptions.NotAnAttrsClassError: pass return obj def to_json(obj) -> str: return json.dumps(encode(obj))