"""JSON Encoder and Decoder"""
# pylint: disable=invalid-name,too-few-public-methods,import-self
import json
from datetime import datetime
from enum import Enum
from functools import partial
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from homecontrol.core import Core
[docs]class JSONEncoder(json.JSONEncoder):
"""Custom JSONEncoder that also parses HomeControl types"""
def __init__(self, core: "Core", *args, **kwargs):
self.core = core
super().__init__(*args, **kwargs)
# pylint: disable=no-self-use,too-many-return-statements,method-hidden
[docs] def default(self, o):
"""Encode custom types"""
if isinstance(o, Enum):
return o.value
if isinstance(o, datetime):
return o.isoformat()
if hasattr(o, "dump"):
return o.dump()
return o
[docs]def dumps(obj, *, indent=None, sort_keys=False, core: "Core" = None, **kw):
"""
Dumps an object into a JSON string with support
for HomeControl's data types
"""
return json.dumps(
obj, cls=partial(JSONEncoder, core=core),
indent=indent, sort_keys=sort_keys, **kw)
[docs]def dump(obj, fp, *, indent=None, sort_keys=False, core: "Core" = None, **kw):
"""
Dumps an object into a Writer with support for HomeControl's data types
"""
return json.dump(
obj, fp, cls=partial(JSONEncoder, core=core),
indent=indent, sort_keys=sort_keys, **kw)