| 51 | |
| 52 | @classmethod |
| 53 | def encode(cls, obj: typing.Any, *, |
| 54 | expected_type: typing.Optional[type]) -> meta.Datum: |
| 55 | if isinstance(obj, sql.SqlRow): |
| 56 | data = sql.SqlRowList([obj]) |
| 57 | |
| 58 | elif isinstance(obj, sql.SqlRowList): |
| 59 | data = obj |
| 60 | |
| 61 | elif isinstance(obj, collections.abc.Iterable): |
| 62 | data = sql.SqlRowList() |
| 63 | |
| 64 | for row in obj: |
| 65 | if not isinstance(row, sql.SqlRow): |
| 66 | raise NotImplementedError( |
| 67 | f'Unsupported list type: {type(obj)}, \ |
| 68 | lists must contain SqlRow objects') |
| 69 | else: |
| 70 | data.append(row) |
| 71 | |
| 72 | else: |
| 73 | raise NotImplementedError(f'Unsupported type: {type(obj)}') |
| 74 | |
| 75 | return meta.Datum( |
| 76 | type='json', |
| 77 | value=json.dumps([dict(d) for d in data]) |
| 78 | ) |