"""JSON Encoder and Decoder"""
# pylint: disable=invalid-name,too-few-public-methods,import-self
from typing import TYPE_CHECKING
from homecontrol.dependencies.entity_types import Item
if TYPE_CHECKING:
from homecontrol.core import Core
import json
from functools import partial
from enum import Enum
from datetime import datetime
[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, Item):
return {
"!type": "Item",
"item_type": o.type,
"id": o.identifier,
"name": o.name
}
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, *, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, indent=None, separators=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, skipkeys=skipkeys, ensure_ascii=ensure_ascii,
check_circular=check_circular,
cls=partial(JSONEncoder, core=core),
allow_nan=allow_nan, indent=indent,
separators=separators, sort_keys=sort_keys, **kw)
[docs]def dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, indent=None, separators=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, skipkeys=skipkeys, ensure_ascii=ensure_ascii,
check_circular=check_circular,
cls=partial(JSONEncoder, core=core),
allow_nan=allow_nan, indent=indent,
separators=separators, sort_keys=sort_keys, **kw)