mirror of
https://codeberg.org/icewind/tf-log-parser.git
synced 2026-06-03 18:24:09 +02:00
better truncation handling
This commit is contained in:
parent
1b9addbb4f
commit
9a11408237
2 changed files with 14 additions and 10 deletions
21
src/lib.rs
21
src/lib.rs
|
|
@ -29,6 +29,8 @@ pub enum Error {
|
|||
Malformed,
|
||||
#[error("Incomplete logfile")]
|
||||
Incomplete,
|
||||
#[error("Incomplete logfile")]
|
||||
Truncated, // like incomplete, but when we're certain the log is at fault, and not the parser
|
||||
#[error("Malformed subject: {0}")]
|
||||
Subject(#[from] SubjectError),
|
||||
#[error("{0}")]
|
||||
|
|
@ -71,28 +73,27 @@ pub fn parse_with_handler<Handler: EventHandler>(
|
|||
),
|
||||
Error,
|
||||
> {
|
||||
let events = raw_events(log);
|
||||
let mut events = raw_events(log);
|
||||
|
||||
let mut handler = Handler::default();
|
||||
|
||||
let mut start_time: Option<NaiveDateTime> = None;
|
||||
let mut subjects = SubjectMap::<Handler::PerSubjectData>::with_capacity(32);
|
||||
|
||||
let mut game_over = false;
|
||||
|
||||
for event_res in events {
|
||||
let raw_event = event_res?;
|
||||
if raw_event.ty == RawEventType::GameOver {
|
||||
game_over = true;
|
||||
}
|
||||
while let Some(event_res) = events.next() {
|
||||
let raw_event = match event_res {
|
||||
Ok(raw_event) => raw_event,
|
||||
Err(Error::Truncated) => break,
|
||||
Err(e) => return Err(e),
|
||||
};
|
||||
let should_handle = Handler::does_handle(raw_event.ty);
|
||||
if should_handle || start_time.is_none() {
|
||||
if should_handle {
|
||||
let event = match GameEvent::parse(&raw_event) {
|
||||
Ok(event) => event,
|
||||
Err(e) => {
|
||||
// handle truncated logs after game over
|
||||
if game_over {
|
||||
// handle truncated logs
|
||||
if events.next().is_none() {
|
||||
break;
|
||||
} else {
|
||||
return Err(e.into());
|
||||
|
|
|
|||
|
|
@ -24,6 +24,9 @@ impl<'a> RawEvent<'a> {
|
|||
}
|
||||
|
||||
fn event_parser(input: &str) -> Result<RawEvent> {
|
||||
if input.len() < 30 {
|
||||
return Err(Error::Truncated);
|
||||
}
|
||||
let date = RawDate(&input[0..21]);
|
||||
|
||||
let (input, subject) = subject_parser(&input[23..])?;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue