You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
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
|