"""Load config from JSON and/or environment.""" from __future__ import annotations import json import os from pathlib import Path from typing import Any from zerto_rewind_mcp.catalog import MutatingCatalog def _env(name: str, default: str | None = None) -> str | None: value = os.environ.get(name) if value is None or value == "": return default return value def load_config(path: str | Path | None = None) -> dict[str, Any]: config_path = Path(path or _env("ZERTO_REWIND_CONFIG") or "config.json") data: dict[str, Any] = {} if config_path.exists(): data = json.loads(config_path.read_text(encoding="utf-8")) data["_config_path"] = str(config_path.resolve()) data.setdefault("zerto_url", _env("ZERTO_URL", "")) data.setdefault("username", _env("ZERTO_USERNAME", "")) data.setdefault("password", _env("ZERTO_PASSWORD", "")) data.setdefault("client_id", _env("ZERTO_CLIENT_ID", "zerto-client")) verify = _env("ZERTO_VERIFY_TLS") if verify is not None: data["verify_tls"] = verify.lower() not in {"0", "false", "no"} else: data.setdefault("verify_tls", False) data.setdefault("recovery_dir", _env("ZERTO_RECOVERY_DIR", "./recovered")) data.setdefault("mutating_tools", data.get("mutating_tools") or []) return data def load_catalog(data: dict[str, Any]) -> MutatingCatalog: path = Path(data["_config_path"]) if data.get("_config_path") else None return MutatingCatalog.from_config(data, path=path)