cereal/src/config/__init__.py
2026-07-30 23:48:10 +09:00

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']