more fine grained line skip

This commit is contained in:
Robin Appelman 2023-03-26 15:34:45 +02:00
commit 8e61628c22
3 changed files with 63 additions and 44 deletions

54
src/error.rs Normal file
View file

@ -0,0 +1,54 @@
use crate::event::GameEventError;
use crate::SubjectError;
use std::num::ParseIntError;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
#[error("Malformed logfile")]
Malformed,
#[error("Incomplete logfile")]
Incomplete,
#[error("Incomplete logfile")]
Skip,
#[error("Malformed subject: {0}")]
Subject(Box<SubjectError>),
#[error("{0}")]
MalformedEvent(Box<GameEventError>),
}
impl From<SubjectError> for Error {
fn from(value: SubjectError) -> Self {
Error::Subject(Box::new(value))
}
}
impl From<GameEventError> for Error {
fn from(value: GameEventError) -> Self {
Error::MalformedEvent(Box::new(value))
}
}
impl From<ParseIntError> for Error {
fn from(_: ParseIntError) -> Self {
Error::Malformed
}
}
pub type Result<O, E = Error> = std::result::Result<O, E>;
#[doc(hidden)]
pub type IResult<'a, O, E = Error> = std::result::Result<(&'a str, O), E>;
pub trait ResultExt: Sized {
fn skip_incomplete(self) -> Self;
}
impl<T> ResultExt for Result<T> {
fn skip_incomplete(self) -> Self {
self.map_err(|e| match e {
Error::Incomplete => Error::Skip,
e => e,
})
}
}

View file

@ -1,64 +1,28 @@
pub use crate::common::{SteamId3, SubjectData, SubjectError, SubjectId}; pub use crate::common::{SteamId3, SubjectData, SubjectError, SubjectId};
use crate::event::GameEventError;
pub use crate::module::EventHandler; pub use crate::module::EventHandler;
use crate::module::{ 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, NaiveDate, NaiveDateTime}; use chrono::{Duration, NaiveDate, NaiveDateTime};
pub(crate) use error::ResultExt;
pub use error::{Error, IResult, Result};
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};
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::convert::TryInto; use std::convert::TryInto;
use std::fmt::Debug;
use std::num::ParseIntError;
pub(crate) use tf_log_parser_derive::{Event, Events}; pub(crate) use tf_log_parser_derive::{Event, Events};
use thiserror::Error;
mod common; mod common;
pub mod event; pub mod event;
#[macro_use] #[macro_use]
pub mod module; pub mod module;
mod error;
pub(crate) mod parsing; pub(crate) mod parsing;
pub mod raw_event; pub mod raw_event;
mod subjectmap; mod subjectmap;
#[derive(Error, Debug)]
pub enum Error {
#[error("Malformed logfile")]
Malformed,
#[error("Incomplete logfile")]
Incomplete,
#[error("Malformed subject: {0}")]
Subject(Box<SubjectError>),
#[error("{0}")]
MalformedEvent(Box<GameEventError>),
}
impl From<SubjectError> for Error {
fn from(value: SubjectError) -> Self {
Error::Subject(Box::new(value))
}
}
impl From<GameEventError> for Error {
fn from(value: GameEventError) -> Self {
Error::MalformedEvent(Box::new(value))
}
}
impl From<ParseIntError> for Error {
fn from(_: ParseIntError) -> Self {
Error::Malformed
}
}
pub type Result<O, E = Error> = std::result::Result<O, E>;
#[doc(hidden)]
pub type IResult<'a, O, E = Error> = std::result::Result<(&'a str, O), E>;
pub fn parse( pub fn parse(
log: &str, log: &str,
) -> Result< ) -> Result<
@ -94,7 +58,8 @@ 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) => continue, Err(Error::Incomplete) if events.next().is_none() => break,
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);

View file

@ -1,6 +1,6 @@
use crate::common::Team; use crate::common::Team;
use crate::parsing::{skip, skip_matches, split_once, split_subject_end}; use crate::parsing::{skip, skip_matches, split_once, split_subject_end};
use crate::{Error, Result}; use crate::{Error, Result, ResultExt};
use crate::{SubjectError, SubjectId}; use crate::{SubjectError, SubjectId};
use chrono::{NaiveDate, NaiveDateTime}; use chrono::{NaiveDate, NaiveDateTime};
use logos::{Lexer, Logos}; use logos::{Lexer, Logos};
@ -26,13 +26,13 @@ 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::Incomplete); return Err(Error::Skip);
} }
let date = RawDate(&input[0..21]); let date = RawDate(&input[0..21]);
let (input, subject) = subject_parser(&input[23..])?; let (input, subject) = subject_parser(&input[23..]).skip_incomplete()?;
let (input, ty) = event_type_parser(input)?; let (input, ty) = event_type_parser(input).skip_incomplete()?;
let params = skip_matches(input, b' ').0; let params = skip_matches(input, b' ').0;