mirror of
https://github.com/eigenein/wotbreplay-parser.git
synced 2026-10-23 19:29:48 +02:00
Break: refactor the parsers
This commit is contained in:
1 parent
68e00c5eca
commit
ac086b1eb2
4 files changed
+24
-7
No files matched your search
@@ -13,6 +13,7 @@ impl BattleResults {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Parsed battle results.
|
||||||
#[derive(Message)]
|
#[derive(Message)]
|
||||||
pub struct BattleResults {
|
pub struct BattleResults {
|
||||||
/// Battle timestamp.
|
/// Battle timestamp.
|
||||||
@@ -24,6 +25,7 @@ pub struct BattleResults {
|
|||||||
pub players: Vec<Player>,
|
pub players: Vec<Player>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Battle player.
|
||||||
#[derive(Message)]
|
#[derive(Message)]
|
||||||
pub struct Player {
|
pub struct Player {
|
||||||
/// Player's account ID.
|
/// Player's account ID.
|
||||||
@@ -35,12 +37,16 @@ pub struct Player {
|
|||||||
pub info: PlayerInfo,
|
pub info: PlayerInfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Player's extended information.
|
||||||
#[derive(Message)]
|
#[derive(Message)]
|
||||||
pub struct PlayerInfo {
|
pub struct PlayerInfo {
|
||||||
/// Player's nickname.
|
/// Player's nickname.
|
||||||
#[prost(string, tag = "1")]
|
#[prost(string, tag = "1")]
|
||||||
pub nickname: String,
|
pub nickname: String,
|
||||||
|
|
||||||
|
/// Some sort of platoon ID:
|
||||||
|
/// - contains same ID for a platoon members, or
|
||||||
|
/// - `None` for non-platoon players
|
||||||
#[prost(uint32, optional, tag = "2")]
|
#[prost(uint32, optional, tag = "2")]
|
||||||
pub platoon_id: Option<u32>,
|
pub platoon_id: Option<u32>,
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,29 @@
|
|||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
|
|
||||||
|
use prost::Message;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde_bytes::ByteBuf;
|
use serde_bytes::ByteBuf;
|
||||||
|
|
||||||
|
use crate::models::BattleResults;
|
||||||
use crate::{Error, Result};
|
use crate::{Error, Result};
|
||||||
|
|
||||||
/// Represents un-pickled `battle_results.dat`.
|
/// Represents un-pickled `battle_results.dat`.
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
pub struct BattleResultsDat(pub(crate) u64, pub(crate) ByteBuf);
|
pub struct BattleResultsDat(
|
||||||
|
/// No idea what this is.
|
||||||
|
u64,
|
||||||
|
/// Protobuf-serialized battle results.
|
||||||
|
ByteBuf,
|
||||||
|
);
|
||||||
|
|
||||||
impl BattleResultsDat {
|
impl BattleResultsDat {
|
||||||
/// Try and parse the pickled structure from the reader which contains `battle_results.dat`.
|
/// Parses the pickled structure from the reader which contains `battle_results.dat`.
|
||||||
pub fn from_reader(reader: impl Read) -> Result<Self> {
|
pub fn from_reader(reader: impl Read) -> Result<Self> {
|
||||||
serde_pickle::from_reader(reader, Default::default()).map_err(Error::UnpickleFailed)
|
serde_pickle::from_reader(reader, Default::default()).map_err(Error::UnpickleFailed)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Decodes the battle results from the internal buffer.
|
||||||
|
pub fn decode_battle_results(&self) -> Result<BattleResults> {
|
||||||
|
BattleResults::decode(self.1.as_ref()).map_err(Error::DecodeFailed)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+1
-3
@@ -1,6 +1,5 @@
|
|||||||
use std::io::{Read, Seek};
|
use std::io::{Read, Seek};
|
||||||
|
|
||||||
use prost::Message;
|
|
||||||
use zip::ZipArchive;
|
use zip::ZipArchive;
|
||||||
|
|
||||||
use crate::error::Error;
|
use crate::error::Error;
|
||||||
@@ -24,7 +23,6 @@ impl<R: Read + Seek> Replay<R> {
|
|||||||
.0
|
.0
|
||||||
.by_name("battle_results.dat")
|
.by_name("battle_results.dat")
|
||||||
.map_err(Error::OpenBattleResultsFailed)?;
|
.map_err(Error::OpenBattleResultsFailed)?;
|
||||||
let battle_results_dat = BattleResultsDat::from_reader(pickled_battle_results)?;
|
BattleResultsDat::from_reader(pickled_battle_results)?.decode_battle_results()
|
||||||
BattleResults::decode(battle_results_dat.1.as_ref()).map_err(Error::DecodeFailed)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
use wotbreplay_parser::models::TeamNumber;
|
||||||
use wotbreplay_parser::Replay;
|
use wotbreplay_parser::Replay;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -13,11 +14,11 @@ fn battle_results_ok() -> Result<()> {
|
|||||||
|
|
||||||
assert_eq!(battle_results.players[0].account_id, 520886428);
|
assert_eq!(battle_results.players[0].account_id, 520886428);
|
||||||
assert_eq!(battle_results.players[0].info.nickname, "77mmmr");
|
assert_eq!(battle_results.players[0].info.nickname, "77mmmr");
|
||||||
assert_eq!(battle_results.players[0].info.team_number, 2);
|
assert_eq!(battle_results.players[0].info.team_number(), TeamNumber::Two);
|
||||||
assert_eq!(battle_results.players[0].info.platoon_id, None);
|
assert_eq!(battle_results.players[0].info.platoon_id, None);
|
||||||
|
|
||||||
assert_eq!(battle_results.players[1].info.nickname, "SNAK_THE_RIPPER");
|
assert_eq!(battle_results.players[1].info.nickname, "SNAK_THE_RIPPER");
|
||||||
assert_eq!(battle_results.players[1].info.team_number, 1);
|
assert_eq!(battle_results.players[1].info.team_number(), TeamNumber::One);
|
||||||
assert_eq!(battle_results.players[1].info.platoon_id, Some(547466834));
|
assert_eq!(battle_results.players[1].info.platoon_id, Some(547466834));
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
Reference in new issue
Block a user