mirror of
https://codeberg.org/icewind/tf-log-parser.git
synced 2026-06-03 18:24:09 +02:00
handle more truncateion
This commit is contained in:
parent
7f258930ef
commit
2cb43e1872
2 changed files with 18 additions and 12 deletions
28
src/lib.rs
28
src/lib.rs
|
|
@ -5,7 +5,7 @@ use crate::module::{
|
||||||
ChatMessages, ClassStatsHandler, HealSpread, MedicStatsBuilder, PlayerHandler,
|
ChatMessages, ClassStatsHandler, HealSpread, MedicStatsBuilder, PlayerHandler,
|
||||||
};
|
};
|
||||||
pub use crate::subjectmap::SubjectMap;
|
pub use crate::subjectmap::SubjectMap;
|
||||||
use chrono::{Duration, NaiveDateTime};
|
use chrono::{Duration, NaiveDate, NaiveDateTime};
|
||||||
pub use event::{Event, EventMeta, GameEvent};
|
pub use event::{Event, EventMeta, GameEvent};
|
||||||
use memchr::memmem::{find_iter, FindIter};
|
use memchr::memmem::{find_iter, FindIter};
|
||||||
pub use raw_event::{RawEvent, RawEventType};
|
pub use raw_event::{RawEvent, RawEventType};
|
||||||
|
|
@ -30,8 +30,6 @@ pub enum Error {
|
||||||
Malformed,
|
Malformed,
|
||||||
#[error("Incomplete logfile")]
|
#[error("Incomplete logfile")]
|
||||||
Incomplete,
|
Incomplete,
|
||||||
#[error("Line should be skipped")]
|
|
||||||
Skip,
|
|
||||||
#[error("Malformed subject: {0}")]
|
#[error("Malformed subject: {0}")]
|
||||||
Subject(Box<SubjectError>),
|
Subject(Box<SubjectError>),
|
||||||
#[error("{0}")]
|
#[error("{0}")]
|
||||||
|
|
@ -96,10 +94,7 @@ pub fn parse_with_handler<Handler: EventHandler>(
|
||||||
while let Some(event_res) = events.next() {
|
while let Some(event_res) = events.next() {
|
||||||
let raw_event = match event_res {
|
let raw_event = match event_res {
|
||||||
Ok(raw_event) => raw_event,
|
Ok(raw_event) => raw_event,
|
||||||
Err(Error::Incomplete) if events.next().is_none() => break,
|
Err(Error::Incomplete) => continue,
|
||||||
Err(Error::Skip) => {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Err(e) => return Err(e),
|
Err(e) => return Err(e),
|
||||||
};
|
};
|
||||||
let should_handle = Handler::does_handle(raw_event.ty);
|
let should_handle = Handler::does_handle(raw_event.ty);
|
||||||
|
|
@ -108,16 +103,22 @@ pub fn parse_with_handler<Handler: EventHandler>(
|
||||||
let event = match GameEvent::parse(&raw_event) {
|
let event = match GameEvent::parse(&raw_event) {
|
||||||
Ok(event) => event,
|
Ok(event) => event,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
let old_date: NaiveDateTime = raw_event
|
||||||
|
.date
|
||||||
|
.try_into()
|
||||||
|
.unwrap_or_else(|_| NaiveDateTime::from_timestamp(0, 0));
|
||||||
|
|
||||||
|
// truncated newline during log combining, ignore error
|
||||||
|
if contains_line_start(raw_event.params, &old_date.date()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
let Some(next) = events.next() else {
|
let Some(next) = events.next() else {
|
||||||
// log is truncated
|
// log is truncated
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Ok(next) = next {
|
if let Ok(next) = next {
|
||||||
let old_date: NaiveDateTime = raw_event
|
|
||||||
.date
|
|
||||||
.try_into()
|
|
||||||
.unwrap_or_else(|_| NaiveDateTime::from_timestamp(0, 0));
|
|
||||||
let new_date: NaiveDateTime = next
|
let new_date: NaiveDateTime = next
|
||||||
.date
|
.date
|
||||||
.try_into()
|
.try_into()
|
||||||
|
|
@ -153,6 +154,11 @@ pub fn parse_with_handler<Handler: EventHandler>(
|
||||||
Ok((global, per_player))
|
Ok((global, per_player))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn contains_line_start(line: &str, date: &NaiveDate) -> bool {
|
||||||
|
let expected_start = format!("L {}", date.format("%m/%d/%Y"));
|
||||||
|
line.contains(&expected_start)
|
||||||
|
}
|
||||||
|
|
||||||
handler!(LogHandler {
|
handler!(LogHandler {
|
||||||
chat: ChatMessages,
|
chat: ChatMessages,
|
||||||
heal_spread: PlayerHandler::<HealSpread>,
|
heal_spread: PlayerHandler::<HealSpread>,
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ impl<'a> RawEvent<'a> {
|
||||||
fn event_parser(input: &str) -> Result<RawEvent> {
|
fn event_parser(input: &str) -> Result<RawEvent> {
|
||||||
// println!("{}", input);
|
// println!("{}", input);
|
||||||
if input.len() < 24 {
|
if input.len() < 24 {
|
||||||
return Err(Error::Skip);
|
return Err(Error::Incomplete);
|
||||||
}
|
}
|
||||||
let date = RawDate(&input[0..21]);
|
let date = RawDate(&input[0..21]);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue