From 2f8a6ed7bc64b1a201f8f0b11950120b93d8e1e4 Mon Sep 17 00:00:00 2001 From: zach Date: Tue, 24 Sep 2024 19:29:38 -0700 Subject: [PATCH] fix: nested Codec classes --- lib/src/prelude.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/src/prelude.py b/lib/src/prelude.py index 4f33168..ffcea1f 100644 --- a/lib/src/prelude.py +++ b/lib/src/prelude.py @@ -25,7 +25,7 @@ class Codec(ABC): """ Codec is used to serialize and deserialize values in Extism memory - """ + """ @abstractmethod def encode(self) -> bytes: @@ -38,6 +38,24 @@ def decode(s: bytes): """Decode a value from bytes""" raise Exception("encode not implemented") + def _fix_fields(self): + if not hasattr(self, '__dict__'): + return + types = self.__annotations__ + for k, v in self.__dict__.items(): + if k in types: + setattr(self, k, self._fix_field(types[k], k, v)) + return self + + def _fix_field(self, ty: type, k, v): + try: + if isinstance(v, dict) and issubclass(ty, Codec): + return ty(**v)._fix_fields() + except Exception as _: + pass + + return v + class JSONEncoder(json.JSONEncoder): def default(self, o): @@ -84,7 +102,7 @@ def encode(self) -> bytes: @classmethod def decode(cls, s: bytes): x = json.loads(s.decode(), cls=JSONDecoder) - return cls(**x) + return cls(**x)._fix_fields() class JsonObject(Json, dict):