"""Rust Coder Environment Client.""" from typing import Dict from openenv.core import EnvClient from openenv.core.client_types import StepResult from openenv.core.env_server.types import State from models import RustCoderAction, RustCoderObservation class RustCoderEnv( EnvClient[RustCoderAction, RustCoderObservation, State] ): """ Client for the Rust Coder Environment. Maintains a persistent WebSocket connection to the environment server. Example: >>> with RustCoderEnv(base_url="http://localhost:8000") as client: ... result = client.reset() ... print(result.observation.problem_description) ... result = client.step(RustCoderAction(code="fn main() {}")) ... print(result.reward) Example with Docker: >>> client = RustCoderEnv.from_docker_image("rust_coder-env:latest") >>> try: ... result = client.reset() ... result = client.step(RustCoderAction(code="fn main() {}")) ... finally: ... client.close() """ def _step_payload(self, action: RustCoderAction) -> Dict: """Convert RustCoderAction to JSON payload for step message.""" return { "code": action.code, } def _parse_result(self, payload: Dict) -> StepResult[RustCoderObservation]: """Parse server response into StepResult[RustCoderObservation].""" obs_data = payload.get("observation", {}) observation = RustCoderObservation( problem_description=obs_data.get("problem_description", ""), header_section=obs_data.get("header_section", ""), compilation_success=obs_data.get("compilation_success", False), compilation_output=obs_data.get("compilation_output", ""), test_results=obs_data.get("test_results", []), reward_breakdown=obs_data.get("reward_breakdown", {}), done=payload.get("done", False), reward=payload.get("reward", 0.0), ) return StepResult( observation=observation, reward=payload.get("reward", 0.0), done=payload.get("done", False), ) def _parse_state(self, payload: Dict) -> State: """Parse server response into State object.""" return State( episode_id=payload.get("episode_id"), step_count=payload.get("step_count", 0), )