use std::io::Read;
use std::error::Error;
use std::fs::File;
use std::env;
use quakeworld::mvd::Mvd;
use quakeworld::state::State;
use quakeworld::protocol::types::ServerMessage;
#[cfg(feature = "trace")]
use quakeworld::utils::trace::*;
fn parse_file(filename: String) -> Result<bool, Box<dyn Error>> {
let mut buffer = Box::new(Vec::new());
let mut file = match File::open(filename) {
Ok(file) => file,
Err(err) => {
return Err(Box::new(err))
}
};
match file.read_to_end(&mut buffer) {
Ok(size) => size,
Err(err) => {
return Err(Box::new(err))
}
};
let mut mvd = Mvd::new(*buffer,
#[cfg(feature = "ascii_strings")]
None,
#[cfg(feature = "trace")]
true,
)?;
let mut state = State::new();
while mvd.finished == false {
let frame = match mvd.parse_frame() {
Ok(v) => {
v
},
Err(e) => {
#[cfg(feature = "trace")]
print_message_trace(&mvd.message, false, 0, 2, false)?;
return Err(Box::new(e));
},
};
state.apply_messages_mvd(&frame.messages, frame.last);
for message in frame.messages {
match message {
ServerMessage::Intermission(_) => {
println!("{:#?}", state.players);
}
_ => {}
}
}
#[cfg(feature = "trace")]
if false { print_message_trace(&mvd.message, false, 0, 2, false)?;
}
}
return Ok(true)
}
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() != 2 {
println!("need to supply a demo");
return
}
let filename = &args[1];
match parse_file(filename.to_string()) {
Ok(..) => {
println!("{} parsed.", filename);
}
Err(err) => {
eprintln!("error in file {}: {}", filename, err);
}
}
}