Source code for mautrix.client.api.types.util.obj

# From https://github.com/Lonami/dumbot/blob/master/dumbot.py
# Modified to add Serializable base
from typing import Dict, List

from .....api import JSON
from .serializable import GenericSerializable, Serializable


[docs]class Obj(GenericSerializable['Obj']): def __init__(self, **kwargs): self.__dict__ = {k: Obj(**v) if isinstance(v, dict) else ( Lst(v) if isinstance(v, list) else v) for k, v in kwargs.items()} def __getattr__(self, name): # FIXME: Why is this function needed? Is it just to strip the '_' from the name? name = name.rstrip('_') obj = self.__dict__.get(name) if obj is None: obj = Obj() self.__dict__[name] = obj return obj def __getitem__(self, name): return self.__dict__.get(name) def __setitem__(self, key, value): self.__dict__[key] = value def __str__(self): return str(self.serialize()) def __repr__(self): return repr(self.serialize()) def __bool__(self): return bool(self.__dict__) def __contains__(self, item): return item in self.__dict__
[docs] def popitem(self): return self.__dict__.popitem()
[docs] def get(self, key, default=None): obj = self.__dict__.get(key) if obj is None: return default else: return obj
[docs] def serialize(self) -> Dict[str, JSON]: return {k: v.serialize() if isinstance(v, Serializable) else v for k, v in self.__dict__.items()}
[docs] @classmethod def deserialize(cls, data: Dict[str, JSON]) -> 'Obj': return cls(**data)
[docs]class Lst(list, GenericSerializable['Lst']): def __init__(self, iterable=()): list.__init__(self, (Obj(**x) if isinstance(x, dict) else (Lst(x) if isinstance(x, list) else x) for x in iterable)) def __repr__(self): return super().__repr__()
[docs] def serialize(self) -> List[JSON]: return [v.serialize() if isinstance(v, Serializable) else v for v in self]
[docs] @classmethod def deserialize(cls, data: List[JSON]) -> 'Lst': return cls(data)