Source code for buildcompiler.adapters.protocols

"""Protocol artifact boundaries for optional file output."""

from __future__ import annotations

import json
from dataclasses import dataclass, field
from pathlib import Path

from buildcompiler.api.options import ProtocolMode, ProtocolOptions


[docs] @dataclass class ProtocolArtifact: kind: str path: Path | None = None content: str | dict[str, object] | list[dict[str, object]] | None = None metadata: dict[str, object] = field(default_factory=dict)
def _artifact_filename(*, basename: str, kind: str) -> str: safe_kind = kind.replace(" ", "_").lower() return f"{basename}_{safe_kind}.json"
[docs] def maybe_write_protocol_artifacts( *, payloads: dict[str, object], options: ProtocolOptions, basename: str = "buildcompiler_protocol", ) -> dict[str, ProtocolArtifact]: """Return in-memory protocol payloads and optionally write them to disk.""" should_write = ( options.mode in {ProtocolMode.MANUAL, ProtocolMode.AUTOMATED} and options.results_dir is not None ) output_dir = Path(options.results_dir) if should_write else None if output_dir is not None: output_dir.mkdir(parents=True, exist_ok=True) artifacts: dict[str, ProtocolArtifact] = {} for kind, payload in payloads.items(): artifact = ProtocolArtifact(kind=kind, content=payload) if output_dir is not None: path = output_dir / _artifact_filename(basename=basename, kind=kind) path.write_text( json.dumps(payload, indent=2, sort_keys=True), encoding="utf-8" ) artifact.path = path artifact.metadata["written"] = True else: artifact.metadata["written"] = False artifacts[kind] = artifact return artifacts