|
| 1 | +import datetime |
| 2 | +import decimal |
| 3 | +import re |
| 4 | +from enum import Enum |
| 5 | + |
1 | 6 | from conductor.asyncio_client.http.api_client import ApiClient |
2 | 7 |
|
3 | | -class ApiClientAdapter(ApiClient): ... |
| 8 | + |
| 9 | +class ApiClientAdapter(ApiClient): |
| 10 | + def __deserialize(self, data, klass): |
| 11 | + """Deserializes dict, list, str into an object. |
| 12 | +
|
| 13 | + :param data: dict, list or str. |
| 14 | + :param klass: class literal, or string of class name. |
| 15 | +
|
| 16 | + :return: object. |
| 17 | + """ |
| 18 | + if data is None: |
| 19 | + return None |
| 20 | + |
| 21 | + if isinstance(klass, str): |
| 22 | + if klass.startswith("List["): |
| 23 | + m = re.match(r"List\[(.*)]", klass) |
| 24 | + assert m is not None, "Malformed List type definition" |
| 25 | + sub_kls = m.group(1) |
| 26 | + return [self.__deserialize(sub_data, sub_kls) for sub_data in data] |
| 27 | + |
| 28 | + if klass.startswith("Dict["): |
| 29 | + m = re.match(r"Dict\[([^,]*), (.*)]", klass) |
| 30 | + assert m is not None, "Malformed Dict type definition" |
| 31 | + sub_kls = m.group(2) |
| 32 | + return {k: self.__deserialize(v, sub_kls) for k, v in data.items()} |
| 33 | + |
| 34 | + # convert str to class |
| 35 | + if klass in self.NATIVE_TYPES_MAPPING: |
| 36 | + klass = self.NATIVE_TYPES_MAPPING[klass] |
| 37 | + else: |
| 38 | + klass = getattr(conductor.asyncio_client.adapters.models, klass) |
| 39 | + |
| 40 | + if klass in self.PRIMITIVE_TYPES: |
| 41 | + return self.__deserialize_primitive(data, klass) |
| 42 | + elif klass == object: |
| 43 | + return self.__deserialize_object(data) |
| 44 | + elif klass == datetime.date: |
| 45 | + return self.__deserialize_date(data) |
| 46 | + elif klass == datetime.datetime: |
| 47 | + return self.__deserialize_datetime(data) |
| 48 | + elif klass == decimal.Decimal: |
| 49 | + return decimal.Decimal(data) |
| 50 | + elif issubclass(klass, Enum): |
| 51 | + return self.__deserialize_enum(data, klass) |
| 52 | + else: |
| 53 | + return self.__deserialize_model(data, klass) |
0 commit comments