import json from dataclasses import dataclass from typing import Any from .logging import Logging from .email import Email from .parse import ConfigParseError, assert_key_of_type @dataclass class Config: host: str | None port: int | None logging: Logging email: Email @classmethod def from_dict(cls, config: dict[str, Any]) -> 'Config': assert_key_of_type(config, 'logging', dict) assert_key_of_type(config, 'email', dict) assert_key_of_type(config, 'host', str) assert_key_of_type(config, 'port', int) try: log_config = Logging.from_dict(config['logging']) except ConfigParseError as e: raise ConfigParseError(['logging', *e.keypath], e.issue) from e try: email_config = Email.from_dict(config['email']) except ConfigParseError as e: raise ConfigParseError(['email', *e.keypath], e.issue) from e return Config(host=config['host'], port=config['port'], email=email_config, logging=log_config) def parse_config(filename: str) -> Config: with open(filename, 'r') as infile: config = json.loads(infile.read()) return Config.from_dict(config) __all__ = ['Config', 'parse_config']