import os import json from dataclasses import dataclass, fields from typing import Any class ConfigException (Exception): pass def default_env_loader(var_name, default_value=None): v = os.getenv(var_name, default_value) if not v: raise ConfigException(var_name) return v def json_env_loader(var_name): v = default_env_loader(var_name) vv = json.loads(v) return vv @dataclass(init=False, frozen=False) class Config: MQTT_BROKER : str MQTT_PORT : int MQTT_CLIENT_PREFIX : str BOXES : dict BOX_TOPIC_PREFIXES : dict CENTRAL_TOPICS : dict OFF_TEMPERATURE : str LOW_TEMPERATURE : str MAINTENANCE_TEMPERATURE : str DEFAULT_HIGH_TEMPERATURE : str STATUS_TOPIC : str CONTEXT_TOPIC_PREFIX : str def __init__(self): for f in fields(self): v = os.getenv(f.name) if not v: raise ConfigException(f.name) if f.type == int: v = int(v) elif f.type == dict: v = json.loads(v) setattr(self, f.name, v)