Source code for ifgen.config
"""
A module implementing a configuration interface for the package.
"""
# built-in
from typing import Any
# third-party
from vcorelib.dict import merge
from vcorelib.dict.codec import BasicDictCodec as _BasicDictCodec
from vcorelib.io import ARBITER as _ARBITER
from vcorelib.io import DEFAULT_INCLUDES_KEY
from vcorelib.io.types import JsonObject as _JsonObject
from vcorelib.paths import Pathlike, find_file
# internal
from ifgen import PKG_NAME
from ifgen.schemas import IfgenDictCodec
[docs]
class Config(IfgenDictCodec, _BasicDictCodec):
"""The top-level configuration object for the package."""
[docs]
def init(self, data: _JsonObject) -> None:
"""Initialize this instance."""
super().init(data)
common = ["identifier", "unit_test"]
# Forward enum settings.
enum_forwards = common + ["use_map"]
enum: dict[str, Any]
for enum in data.get("enums", {}).values(): # type: ignore
for forward in enum_forwards:
enum.setdefault(
forward,
data["enum"][forward], # type: ignore
)
# Forward struct settings.
struct_forwards = common + [
"codec",
"stream",
"methods",
"default_endianness",
"packed",
]
struct: dict[str, Any]
for struct in data.get("structs", {}).values(): # type: ignore
for forward in struct_forwards:
struct.setdefault(
forward,
data["struct"][forward], # type: ignore
)
[docs]
def load(path: Pathlike) -> Config:
"""Load a configuration object."""
src_config = find_file("default.yaml", package=PKG_NAME)
assert src_config is not None
data = merge(
_ARBITER.decode(
src_config,
includes_key=DEFAULT_INCLUDES_KEY,
require_success=True,
).data,
_ARBITER.decode(
path, includes_key=DEFAULT_INCLUDES_KEY, require_success=True
).data,
# Always allow the project-specific configuration to override package
# data.
expect_overwrite=True,
)
return Config.create(data)