Raise SmartDeviceException on invalid config dicts (#640)

Co-authored-by: J. Nick Koston <nick@koston.org>
This commit is contained in:
Steven B
2024-01-18 17:51:50 +00:00
committed by GitHub
parent 642e9a1f5b
commit c3329155c8
2 changed files with 28 additions and 6 deletions

View File

@@ -37,11 +37,16 @@ def _dataclass_from_dict(klass, in_val):
fieldtypes = {f.name: f.type for f in fields(klass)}
val = {}
for dict_key in in_val:
if dict_key in fieldtypes and hasattr(fieldtypes[dict_key], "from_dict"):
val[dict_key] = fieldtypes[dict_key].from_dict(in_val[dict_key])
if dict_key in fieldtypes:
if hasattr(fieldtypes[dict_key], "from_dict"):
val[dict_key] = fieldtypes[dict_key].from_dict(in_val[dict_key])
else:
val[dict_key] = _dataclass_from_dict(
fieldtypes[dict_key], in_val[dict_key]
)
else:
val[dict_key] = _dataclass_from_dict(
fieldtypes[dict_key], in_val[dict_key]
raise SmartDeviceException(
f"Cannot create dataclass from dict, unknown key: {dict_key}"
)
return klass(**val)
else:
@@ -173,6 +178,8 @@ class DeviceConfig:
return _dataclass_to_dict(self)
@staticmethod
def from_dict(cparam_dict: Dict[str, Dict[str, str]]) -> "DeviceConfig":
def from_dict(config_dict: Dict[str, Dict[str, str]]) -> "DeviceConfig":
"""Return device config from dict."""
return _dataclass_from_dict(DeviceConfig, cparam_dict)
if isinstance(config_dict, dict):
return _dataclass_from_dict(DeviceConfig, config_dict)
raise SmartDeviceException(f"Invalid device config data: {config_dict}")