This commit is contained in:
2025-03-20 21:26:04 -03:00
parent 85cbc9269c
commit 1f19380f5c
20 changed files with 293 additions and 54 deletions

View File

@@ -9,31 +9,49 @@ from botocore.exceptions import ClientError
logger = Logger(__name__)
def _serialize(v):
if isinstance(v, datetime):
return v.isoformat()
if isinstance(v, IPv4Address):
return str(v)
if isinstance(v, (list, tuple)):
return [_serialize(x) for x in v]
if isinstance(v, dict):
return {k: _serialize(dv) for k, dv in v.items()}
return v
def _serialize_python_types(obj: Any) -> str | dict | list:
match obj:
case datetime():
return obj.isoformat()
case IPv4Address():
return str(obj)
case list() | tuple():
return [_serialize_python_types(v) for v in obj]
case dict():
return {k: _serialize_python_types(v) for k, v in obj.items()}
case _:
return obj
def serialize(obj: dict) -> dict:
return {k: TypeSerializer().serialize(_serialize(v)) for k, v in obj.items()}
serializer = TypeSerializer()
return {k: serializer.serialize(_serialize_python_types(v)) for k, v in obj.items()}
def deserialize(obj: dict) -> dict:
return {k: TypeDeserializer().deserialize(v) for k, v in obj.items()}
deserializer = TypeDeserializer()
return {k: deserializer.deserialize(v) for k, v in obj.items()}
def Key(pk: str, sk: str) -> dict[str, str]:
def Key(
val: str | tuple[str, ...],
*,
prefix: str | None = None,
delimiter: str = '#',
) -> str:
if not prefix and not isinstance(val, tuple):
return val
if isinstance(val, str):
val = (val,)
if prefix:
val = (prefix,) + val
return delimiter.join(val)
def KeyPair(pk: str, sk: str) -> dict[str, str]:
return {
'id': pk,
'sk': sk,