from __future__ import annotations from typing import TypeVar import toml class Config: values: dict = {} @staticmethod def load_config(file): with open(file, "r", encoding="utf-8") as f: Config.values = toml.load(f) @staticmethod def get(key: str, default=None, type=None, empty_is_none=False): key_path = key.split(".") value = Config.values for k in key_path: if k in value: value = value[k] else: return default if empty_is_none and value == "": return None if type == bool: if isinstance(value, bool): return value elif isinstance(value, int) or isinstance(value, float): return value != 0 else: return str(value).lower() in ("yes", "true", "1") elif type == int: return int(value) elif type == float: return float(value) elif type == str: return str(value) elif type == list: if not isinstance(value, list): return [] elif type == dict: if not isinstance(value, dict): return {} else: return value @staticmethod def set(key: str, value): key_path = key.split(".") obj = Config.values for k in key_path[:-1]: if k not in obj: obj[k] = {} obj = obj[k] obj[key_path[-1]] = value