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:
@@ -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})
|
||||
|
||||
Reference in New Issue
Block a user