Source code for runtimepy.primitives.field.manager
"""
A management entity for bit-fields.
"""
# built-in
from typing import Iterable as _Iterable
from typing import cast as _cast
# third-party
from vcorelib.io import ARBITER as _ARBITER
from vcorelib.io.types import JsonObject as _JsonObject
from vcorelib.io.types import JsonValue as _JsonValue
from vcorelib.paths import Pathlike as _Pathlike
# internal
from runtimepy.enum.registry import EnumRegistry as _EnumRegistry
from runtimepy.primitives.field.fields import BitFields as _BitFields
from runtimepy.primitives.field.manager.base import BitFieldsManagerBase
from runtimepy.registry.name import NameRegistry as _NameRegistry
NAMES_KEY = "names"
ENUMS_KEY = "enums"
FIELDS_KEY = "fields"
VALUES_KEY = "values"
[docs]
def fields_from_dict(data: _JsonObject) -> _Iterable[_BitFields]:
"""Load bit-fields from JSON data."""
return [
_BitFields.create(x)
for x in _cast(_Iterable[_JsonObject], data["items"])
]
[docs]
def fields_from_file(path: _Pathlike) -> _Iterable[_BitFields]:
"""Load bit-fields from a file."""
return fields_from_dict(_ARBITER.decode(path, require_success=True).data)
[docs]
class BitFieldsManager(BitFieldsManagerBase):
"""A class for managing multiple bit-fields objects."""
[docs]
def export_json(self, resolve_enum: bool = True) -> dict[str, _JsonObject]:
"""Export this manager's data to JSON."""
# Only export names that we're using.
names: _JsonObject = {
name: self.registry.identifier(name) for name in self.lookup
}
# Only export enums that we're using.
enum_ids: set[int] = {x.id for x in self.enums.items.values()}
enums: _JsonObject = {
name: _cast(_JsonValue, val.asdict())
for name, val in self.enums.items.items()
if val.id in enum_ids
}
return {
NAMES_KEY: names,
ENUMS_KEY: enums,
FIELDS_KEY: self.asdict(),
VALUES_KEY: _cast(
_JsonObject, self.values(resolve_enum=resolve_enum)
),
}
[docs]
@classmethod
def import_json(cls, data: dict[str, _JsonObject]) -> "BitFieldsManager":
"""Create a bit-fields manager from JSON data."""
result = cls(
_NameRegistry(reverse=_cast(dict[str, int], data[NAMES_KEY])),
_EnumRegistry.create(data[ENUMS_KEY]),
fields=fields_from_dict(data[FIELDS_KEY]),
)
# Set values.
for name, value in data.get(VALUES_KEY, {}).items():
result.set(name, _cast(int, value))
return result