app_config.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. """YAML configuration loading."""
  2. from dataclasses import dataclass
  3. from pathlib import Path
  4. from typing import Any
  5. import yaml
  6. @dataclass(frozen=True)
  7. class DbConfig:
  8. host: str
  9. port: int
  10. database: str
  11. user: str
  12. password: str
  13. @dataclass(frozen=True)
  14. class ModbusConfig:
  15. host: str = "0.0.0.0"
  16. port: int = 502
  17. interval: int = 5
  18. @dataclass(frozen=True)
  19. class HttpProviderConfig:
  20. url: str = "http://192.168.1.109:18503/data/get_points_real_value"
  21. timeout_seconds: int = 5
  22. @dataclass(frozen=True)
  23. class LoggingConfig:
  24. dir: str = "logs"
  25. retention_days: int = 3
  26. level: str = "INFO"
  27. @dataclass(frozen=True)
  28. class AppConfig:
  29. db: DbConfig
  30. modbus: ModbusConfig
  31. http_provider: HttpProviderConfig
  32. logging: LoggingConfig
  33. def load_config(path: str | Path) -> AppConfig:
  34. config_path = Path(path)
  35. with config_path.open("r", encoding="utf-8") as file:
  36. raw = yaml.safe_load(file) or {}
  37. db = _require_mapping(raw, "db")
  38. return AppConfig(
  39. db=DbConfig(
  40. host=str(_require(db, "host")),
  41. port=int(_require(db, "port")),
  42. database=str(_require(db, "database")),
  43. user=str(_require(db, "user")),
  44. password=str(_require(db, "password")),
  45. ),
  46. modbus=_load_modbus(raw.get("modbus") or {}),
  47. http_provider=_load_http_provider(raw.get("http_provider") or {}),
  48. logging=_load_logging(raw.get("logging") or {}),
  49. )
  50. def _load_modbus(raw: dict[str, Any]) -> ModbusConfig:
  51. return ModbusConfig(
  52. host=str(raw.get("host", "0.0.0.0")),
  53. port=int(raw.get("port", 502)),
  54. interval=int(raw.get("interval", 5)),
  55. )
  56. def _load_http_provider(raw: dict[str, Any]) -> HttpProviderConfig:
  57. return HttpProviderConfig(
  58. url=str(raw.get("url", "http://192.168.1.109:18503/data/get_points_real_value")),
  59. timeout_seconds=int(raw.get("timeout_seconds", 5)),
  60. )
  61. def _load_logging(raw: dict[str, Any]) -> LoggingConfig:
  62. return LoggingConfig(
  63. dir=str(raw.get("dir", "logs")),
  64. retention_days=int(raw.get("retention_days", 3)),
  65. level=str(raw.get("level", "INFO")),
  66. )
  67. def _require_mapping(raw: dict[str, Any], key: str) -> dict[str, Any]:
  68. value = raw.get(key)
  69. if not isinstance(value, dict):
  70. raise ValueError(f"配置缺失或格式错误: {key}")
  71. return value
  72. def _require(raw: dict[str, Any], key: str) -> Any:
  73. if key not in raw or raw[key] is None:
  74. raise ValueError(f"配置缺失: {key}")
  75. return raw[key]