config: filter unknown toml keys before dataclass init

Prevents opaque TypeError on typos in config.toml; unknown
keys are logged as warnings and silently dropped.
This commit is contained in:
Username
2026-02-24 16:23:04 +01:00
parent 8be475f23f
commit 44da57d084

View File

@@ -1,8 +1,12 @@
"""Configuration management."""
import dataclasses
import logging
from dataclasses import dataclass, field
from pathlib import Path
log = logging.getLogger(__name__)
CONFIG_DIR = Path.home() / ".config" / "tuimble"
CONFIG_FILE = CONFIG_DIR / "config.toml"
@@ -60,9 +64,18 @@ def load_config(path: Path | None = None) -> Config:
cfg = Config()
if "server" in data:
cfg.server = ServerConfig(**data["server"])
cfg.server = _load_section(ServerConfig, data["server"])
if "audio" in data:
cfg.audio = AudioConfig(**data["audio"])
cfg.audio = _load_section(AudioConfig, data["audio"])
if "ptt" in data:
cfg.ptt = PttConfig(**data["ptt"])
cfg.ptt = _load_section(PttConfig, data["ptt"])
return cfg
def _load_section(cls, raw: dict):
"""Instantiate a dataclass, silently dropping unknown keys."""
valid = {f.name for f in dataclasses.fields(cls)}
unknown = set(raw) - valid
if unknown:
log.warning("ignoring unknown config keys: %s", ", ".join(sorted(unknown)))
return cls(**{k: v for k, v in raw.items() if k in valid})