Skip to content

Commit

Permalink
Refactor: match is not supported in Python 3.9
Browse files Browse the repository at this point in the history
  • Loading branch information
Root-Core committed Dec 17, 2024
1 parent 02a0213 commit 19f61d0
Showing 1 changed file with 25 additions and 18 deletions.
43 changes: 25 additions & 18 deletions config_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
from dataclasses import dataclass, is_dataclass
from pathlib import Path

from typing import Any
from collections.abc import Callable

from logger import log, LogLevelType

class ConfigBase:
Expand Down Expand Up @@ -50,7 +53,7 @@ def init_sections(self, force: bool = False) -> None:
continue

# Initialize section class as a member
setattr(self, section_name, member())
setattr(self, section_name, member()) # pyright: ignore [reportCallIssue]


def parse_config_file(self, file: Path) -> bool:
Expand All @@ -72,25 +75,29 @@ def parse_config_file(self, file: Path) -> bool:

parser_items = parser[section_name]

# FIXME: match is not supported in Python 3.9
def _get_parse_function(type_name: str) -> Callable[[str], Any]:
# Mapping of type_name to according value get function
value = {
'int': parser_items.getint,
'float': parser_items.getfloat,
'bool': parser_items.getboolean,
'Path': lambda option: Path(parser_items.get(option, '')),
'PosixPath': lambda option: Path(parser_items.get(option, '')),
'str': parser_items.get
}.get(type_name, None)
if not value:
value = parser_items.get
self.__log(f'Unknown type "{type_name}", falling back to "str".')
return value

# Iterate over the option objects in this section
for (option_name, option_item) in section.__dict__.items():
# Match type of local object
match type(option_item).__name__:
case 'int':
setattr(section, option_name, parser_items.getint(option_name))
case 'float':
setattr(section, option_name, parser_items.getfloat(option_name))
case 'bool':
setattr(section, option_name, parser_items.getboolean(option_name))
case 'Path':
setattr(section, option_name, Path(parser_items.get(option_name)))
case 'PosixPath':
setattr(section, option_name, Path(parser_items.get(option_name)))
case 'str':
setattr(section, option_name, parser_items.get(option_name))
case _:
setattr(section, option_name, parser_items.get(option_name))
self.__log(f'[CONFIG]: Type mismatch')
# Get values from config and set it on object
type_name = type(option_item).__name__
func = _get_parse_function(type_name)
value = func(option_name)
setattr(section, option_name, value)
except Exception as ex:
self.__log(f'Failed to parse config file "{file}". Exception: "{ex}"', 'CRIT')
return False
Expand Down

0 comments on commit 19f61d0

Please sign in to comment.