35 lines
1.1 KiB
Python
35 lines
1.1 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Tuple
|
|
|
|
from .models import ActionPayload, ActionResult
|
|
|
|
|
|
class ActionEngine:
|
|
def __init__(self, grid) -> None:
|
|
self.grid = grid
|
|
|
|
def plan(self, payload: ActionPayload) -> ActionResult:
|
|
coords = self._resolve_coords(payload.target_cell)
|
|
detail = self._describe(payload, coords)
|
|
return ActionResult(
|
|
success=True,
|
|
detail=detail,
|
|
coordinates=coords,
|
|
payload={"comment": payload.comment or "", "text": payload.text or ""},
|
|
)
|
|
|
|
def _resolve_coords(self, target_cell: str | None) -> Tuple[int, int] | None:
|
|
if not target_cell:
|
|
return None
|
|
return self.grid.resolve_cell_center(target_cell)
|
|
|
|
def _describe(
|
|
self, payload: ActionPayload, coords: Tuple[int, int] | None
|
|
) -> str:
|
|
cell_info = payload.target_cell or "free space"
|
|
location = f"@{cell_info}" if coords else "(no target)"
|
|
action_hint = payload.action.value
|
|
extra = f" text='{payload.text}'" if payload.text else ""
|
|
return f"Plan {action_hint} {location}{extra}"
|