Source code for simulator.apis

from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any, Dict, Optional
from . import core, io


[docs] @dataclass class RunRequest: verb: str params: Dict[str, Any] = field(default_factory=dict) infile: Optional[str] = None outfile: Optional[str] = None
[docs] @dataclass class RunResult: ok: bool data: Dict[str, Any] = field(default_factory=dict) reason: str = ""
[docs] def run(request: RunRequest) -> RunResult: """Dispatch high-level verbs for the simulator CLI / TUI. Currently supported verbs: - "run-sim": run a cycle simulation from JSON config - "list-inputs": list available JSON inputs under simulator/in - "plot-indicator": generate a P–V HTML plot from a result JSON """ verb = request.verb try: if verb == "run-sim": if not request.infile: return RunResult(ok=False, reason="Missing infile for run-sim") cfg = io.load_json(request.infile) sim = core.EngineSimulator.from_dict(cfg) cycles = int(request.params.get("cycles", 1)) result = sim.run(cycles=cycles) out_dict = result.to_dict() if request.outfile: io.ensure_dir_for(request.outfile) io.save_json(request.outfile, out_dict) return RunResult( ok=True, data={ "summary": sim.summary(result), "result": out_dict, "outfile": request.outfile, }, ) elif verb == "list-inputs": inputs = io.list_input_files() return RunResult(ok=True, data={"inputs": inputs}) elif verb == "plot-indicator": result_path = request.params.get("result_path") if not result_path: return RunResult(ok=False, reason="Missing result_path for plot-indicator") out_html = request.params.get("out_html") if not out_html: out_html = io.default_plot_path(result_path, kind="pv") fig = io.plot_indicator_pv(result_path) io.ensure_dir_for(out_html) fig.write_html(out_html) print(f"[PLOT] Wrote indicator diagram to {out_html}") return RunResult(ok=True, data={"html": out_html}) else: return RunResult(ok=False, reason=f"Unknown verb: {verb}") except Exception as exc: # pragma: no cover - defensive return RunResult(ok=False, reason=str(exc))