import yaml from model import AppConfig, MqttConfig, TdengineConfig, TmsConfig, WitsConfig def get_value(cfg, *paths, default=None): for path in paths: current = cfg found = True for key in path: if not isinstance(current, dict) or key not in current: found = False break current = current[key] if found and current is not None: return current return default def load(path: str) -> AppConfig: with open(path, "r", encoding="utf-8") as f: raw = yaml.safe_load(f) or {} base_client_id = get_value(raw, ("mqtt", "client-id"), ("client-id",), default="mqtt") device_code = get_value( raw, ("tms", "device-code"), ("tms", "equipment-sn"), ("device-code",), ("equipment-sn",), default="GJ-304-0088", ) equipment_sn = get_value( raw, ("tms", "equipment-sn"), ("tms", "device-code"), ("equipment-sn",), ("device-code",), default=device_code, ) td_url = get_value(raw, ("tdengine", "url"), ("tdengine-url",), default="") td_database = get_value(raw, ("tdengine", "database"), ("tdengine-database",), default="") return AppConfig( mqtt=MqttConfig( broker=get_value(raw, ("mqtt", "broker"), ("broker",), default=""), client_id=base_client_id, mock_client_id=get_value(raw, ("mqtt", "mock-client-id"), ("mock-client-id",), default=f"{base_client_id}-mock"), sender_client_id=get_value(raw, ("mqtt", "sender-client-id"), ("sender-client-id",), default=f"{base_client_id}-sender"), subscriber_client_id=get_value(raw, ("mqtt", "subscriber-client-id"), ("subscriber-client-id",), default=f"{base_client_id}-subscriber"), username=get_value(raw, ("mqtt", "username"), ("username",)), password=get_value(raw, ("mqtt", "password"), ("password",)), pub_topic=get_value(raw, ("mqtt", "pub-topic"), ("pub-topic",)), sub_topic=get_value(raw, ("mqtt", "sub-topic"), ("sub-topic",)), ack_topic=get_value(raw, ("mqtt", "ack-topic"), ("ack-topic",)), data_file=get_value(raw, ("mqtt", "data-file"), ("data-file",), default=""), ), tms=TmsConfig( device_code=device_code, equipment_sn=equipment_sn, timeout=int(get_value(raw, ("tms", "timeout"), ("timeout",), default=10)), keepalive=int(get_value(raw, ("tms", "keepalive"), ("keepalive",), default=20)), server_ip=get_value(raw, ("tms", "server-ip"), ("server-ip",)), server_port=get_value(raw, ("tms", "server-port"), ("server-port",)), ), wits=WitsConfig( host=get_value(raw, ("wits", "host"), ("tms", "server-ip"), ("server-ip",), default=""), port=int(get_value(raw, ("wits", "port"), ("tms", "server-port"), ("server-port",), default=0)), timeout=int(get_value(raw, ("wits", "timeout"), ("tms", "timeout"), ("timeout",), default=10)), source_file=get_value(raw, ("wits", "source-file"), default=""), ), tdengine=TdengineConfig( url=td_url, username=get_value(raw, ("tdengine", "username"), ("tdengine-username",), default=""), password=get_value(raw, ("tdengine", "password"), ("tdengine-password",), default=""), database=td_database, stable=get_value(raw, ("tdengine", "stable"), ("tdengine-stable",), default="drilling_realtime_st"), device_code=get_value(raw, ("tdengine", "device-code"), ("tdengine", "equipment-sn"), default=device_code), pool_size=int(get_value(raw, ("tdengine", "pool-size"), ("tdengine-pool-size",), default=2)), timeout=int(get_value(raw, ("tdengine", "timeout"), ("tdengine-timeout",), default=10)), ), raw=raw, )