42 lines
1.2 KiB
Python
42 lines
1.2 KiB
Python
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']
|