Separate workspace crate at tooling/test-client/ importing bridge types from server crate. CLI: --connect, --replay, --text, --json, --quiet, --golden, --ticks. Exit codes: 0=success, 1=golden mismatch, 2=connection error. Golden file comparison with recursive JSON diff. JSONL replay loader for tick-scheduled input sending. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
25 lines
864 B
Rust
25 lines
864 B
Rust
// JSONL replay file loader for test-client.
|
|
// Each line is a JSON array of PlayerInput for one tick.
|
|
// Empty array = idle tick (no input sent).
|
|
|
|
use settled_reach_server::bridge::types::PlayerInput;
|
|
use std::path::Path;
|
|
|
|
/// Load a JSONL replay file. Returns one Vec<PlayerInput> per tick.
|
|
pub fn load_replay(path: &Path) -> Result<Vec<Vec<PlayerInput>>, String> {
|
|
let content = std::fs::read_to_string(path)
|
|
.map_err(|e| format!("failed to read replay file {}: {}", path.display(), e))?;
|
|
|
|
let mut ticks = Vec::new();
|
|
for (i, line) in content.lines().enumerate() {
|
|
let line = line.trim();
|
|
if line.is_empty() {
|
|
continue;
|
|
}
|
|
let inputs: Vec<PlayerInput> =
|
|
serde_json::from_str(line).map_err(|e| format!("replay line {}: {}", i + 1, e))?;
|
|
ticks.push(inputs);
|
|
}
|
|
Ok(ticks)
|
|
}
|