From 6fb70da06fc5d1e7f6de8f1c8cfcf15c78513ee1 Mon Sep 17 00:00:00 2001 From: Pavel Perestoronin Date: Sat, 3 Dec 2022 17:59:04 +0100 Subject: [PATCH] Opt: extract `BattleResultsDat::from_reader` --- src/models/battle_results_dat.rs | 11 +++++++++++ src/replay.rs | 8 ++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/models/battle_results_dat.rs b/src/models/battle_results_dat.rs index 14ff30e..42018c6 100644 --- a/src/models/battle_results_dat.rs +++ b/src/models/battle_results_dat.rs @@ -1,6 +1,17 @@ +use std::io::Read; + use serde::Deserialize; use serde_bytes::ByteBuf; +use crate::{Error, Result}; + /// Represents un-pickled `battle_results.dat`. #[derive(Debug, Deserialize)] pub struct BattleResultsDat(pub(crate) u64, pub(crate) ByteBuf); + +impl BattleResultsDat { + /// Try and parse the pickled structure from the reader which contains `battle_results.dat`. + pub fn from_reader(reader: impl Read) -> Result { + serde_pickle::from_reader(reader, Default::default()).map_err(Error::UnpickleFailed) + } +} diff --git a/src/replay.rs b/src/replay.rs index bcc291e..cec713f 100644 --- a/src/replay.rs +++ b/src/replay.rs @@ -7,24 +7,24 @@ use crate::error::Error; use crate::models::{BattleResults, BattleResultsDat}; use crate::result::Result; +/// Opened (but not yet parsed) replay. pub struct Replay(pub(crate) ZipArchive); impl Replay { - /// Opens a replay from the reader. + /// Opens a replay from the reader which contains a `*.wotbreplay`. pub fn open(reader: R) -> Result { ZipArchive::new(reader) .map_err(Error::OpenArchiveFailed) .map(Self) } + /// Reads and parses the battle results from the replay. pub fn read_battle_results(&mut self) -> Result { let pickled_battle_results = self .0 .by_name("battle_results.dat") .map_err(Error::OpenBattleResultsFailed)?; - let battle_results_dat: BattleResultsDat = - serde_pickle::from_reader(pickled_battle_results, Default::default()) - .map_err(Error::UnpickleFailed)?; + let battle_results_dat = BattleResultsDat::from_reader(pickled_battle_results)?; BattleResults::decode(battle_results_dat.1.as_ref()).map_err(Error::DecodeFailed) } }