from collections.abc import Sequence
from typing import Any
from rics.collections.misc import as_list
from id_translation.offline import TranslationMap
from id_translation.types import IdType, NameType, SourceType
from .._data_structure_io import DataStructureIO
[docs]
class DictIO(DataStructureIO[dict[NameType, IdType], NameType, SourceType, IdType]):
"""IO implementation for ``dict`` types."""
priority = 1000
[docs]
@classmethod
def handles_type(cls, arg: Any) -> bool:
return isinstance(arg, dict)
[docs]
@classmethod
def names(cls, translatable: dict[NameType, IdType]) -> list[NameType]:
return list(translatable)
[docs]
@classmethod
def insert(
cls,
translatable: dict[NameType, IdType] | dict[NameType, Sequence[IdType]],
names: list[NameType],
tmap: TranslationMap[NameType, SourceType, IdType],
copy: bool,
) -> dict[NameType, Any] | None:
from .._resolve import resolve_io # noqa: PLC0415
translated = {}
for key, value in translatable.items():
dio: DataStructureIO[IdType | Sequence[IdType], NameType, SourceType, IdType] = resolve_io(value)
if key in names:
translated[key] = dio.insert(value, [key], tmap, copy=True)
else:
translated[key] = value
if copy:
return translated
translatable.clear()
translatable.update(translated) # type: ignore[arg-type]
return None