Skip to content

Commit 3b39abd

Browse files
committed
Implement a very basic CLI.
1 parent f235598 commit 3b39abd

File tree

4 files changed

+397
-3
lines changed

4 files changed

+397
-3
lines changed

Cargo.lock

Lines changed: 208 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

broodrep-cli/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,5 @@ license = "MIT OR Apache-2.0"
66

77
[dependencies]
88
broodrep = { version = "0.1.0", path = "../broodrep" }
9+
clap = { version = "4.5", features = ["derive"] }
10+
anyhow = "1.0"

broodrep-cli/src/main.rs

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,86 @@
1-
fn main() {
2-
println!("Hello, world!");
1+
use anyhow::Result;
2+
use clap::Parser;
3+
use std::fs::File;
4+
5+
#[derive(Parser)]
6+
#[command(name = "broodrep-cli")]
7+
#[command(about = "A StarCraft 1 replay file parser")]
8+
#[command(version)]
9+
struct Args {
10+
/// Path to the StarCraft 1 replay file (.rep)
11+
replay_file: std::path::PathBuf,
12+
}
13+
14+
fn main() -> Result<()> {
15+
let args = Args::parse();
16+
17+
let file = File::open(&args.replay_file)?;
18+
let replay = broodrep::Replay::new(file)?;
19+
20+
display_replay_info(&replay);
21+
22+
Ok(())
23+
}
24+
25+
fn display_replay_info(replay: &broodrep::Replay<std::fs::File>) {
26+
println!("StarCraft 1 Replay Information");
27+
println!("=============================");
28+
println!();
29+
30+
// Game Information Section
31+
println!("Game Information:");
32+
println!(" Format: {}", replay.format());
33+
println!(" Engine: {}", replay.engine());
34+
35+
let duration = format_duration(replay.frames(), replay.game_speed());
36+
println!(" Duration: {}", duration);
37+
38+
if let Some(start_time) = replay.start_time() {
39+
println!(" Started: {}", start_time.format("%Y-%m-%d %H:%M:%S"));
40+
}
41+
42+
println!(" Title: {}", replay.game_title());
43+
let (width, height) = replay.map_dimensions();
44+
println!(" Map: {} ({}x{})", replay.map_name(), width, height);
45+
println!();
46+
47+
// Game Settings Section
48+
println!("Game Settings:");
49+
println!(" Speed: {}", replay.game_speed());
50+
println!(" Type: {}", replay.game_type());
51+
println!(" Host: {}", replay.host_name());
52+
println!();
53+
54+
// Players Section
55+
let players: Vec<_> = replay.players().collect();
56+
if !players.is_empty() {
57+
println!("Players:");
58+
for (i, player) in players.iter().enumerate() {
59+
println!(" [{}] {} ({}, {}, Team {})",
60+
i + 1,
61+
player.name,
62+
player.race,
63+
player.player_type,
64+
player.team);
65+
}
66+
println!();
67+
}
68+
69+
// Observers Section
70+
let observers: Vec<_> = replay.observers().collect();
71+
if !observers.is_empty() {
72+
println!("Observers:");
73+
for observer in observers {
74+
println!(" [Obs] {}", observer.name);
75+
}
76+
println!();
77+
}
78+
}
79+
80+
fn format_duration(frames: u32, speed: broodrep::GameSpeed) -> String {
81+
let total_duration = speed.time_per_step() * frames;
82+
let total_seconds = total_duration.as_secs();
83+
let minutes = total_seconds / 60;
84+
let seconds = total_seconds % 60;
85+
format!("{}:{:02} ({} frames at {})", minutes, seconds, frames, speed)
386
}

0 commit comments

Comments
 (0)