mirror of
https://codeberg.org/icewind/tf-log-parser.git
synced 2026-06-03 18:24:09 +02:00
even more edge cases
This commit is contained in:
parent
2dcd691f66
commit
b01029ddde
4 changed files with 93 additions and 60 deletions
|
|
@ -32,7 +32,7 @@ impl GlobalData for HighestDamageHandler {
|
||||||
..
|
..
|
||||||
}) = event
|
}) = event
|
||||||
{
|
{
|
||||||
let damage = damage.get();
|
let damage = *damage as u32;
|
||||||
match &mut self.current {
|
match &mut self.current {
|
||||||
Some((_, current_damage)) if damage > *current_damage => {
|
Some((_, current_damage)) if damage > *current_damage => {
|
||||||
self.current = Some((subject, damage))
|
self.current = Some((subject, damage))
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use indicatif::ParallelProgressIterator;
|
use indicatif::{ParallelProgressIterator, ProgressBar, ProgressStyle};
|
||||||
use main_error::MainError;
|
use main_error::MainError;
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use std::env::args;
|
use std::env::args;
|
||||||
|
|
@ -6,7 +6,7 @@ use std::ffi::OsStr;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::hint::black_box;
|
use std::hint::black_box;
|
||||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
use std::time::Instant;
|
use std::time::{Duration, Instant};
|
||||||
use tf_log_parser::parse;
|
use tf_log_parser::parse;
|
||||||
use walkdir::WalkDir;
|
use walkdir::WalkDir;
|
||||||
|
|
||||||
|
|
@ -18,12 +18,40 @@ fn main() -> Result<(), MainError> {
|
||||||
let count = AtomicUsize::default();
|
let count = AtomicUsize::default();
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
|
|
||||||
WalkDir::new(path)
|
let style = ProgressStyle::with_template(
|
||||||
|
"[{elapsed_precise}] {wide_bar:.cyan/blue} {per_sec:!} {pos:>7}/{len:7}",
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let pb = ProgressBar::new_spinner();
|
||||||
|
pb.enable_steady_tick(Duration::from_millis(120));
|
||||||
|
pb.set_style(
|
||||||
|
ProgressStyle::with_template("[{elapsed_precise}] {spinner:.blue} {msg}")
|
||||||
|
.unwrap()
|
||||||
|
.tick_strings(&[
|
||||||
|
"▹▹▹▹▹",
|
||||||
|
"▸▹▹▹▹",
|
||||||
|
"▹▸▹▹▹",
|
||||||
|
"▹▹▸▹▹",
|
||||||
|
"▹▹▹▸▹",
|
||||||
|
"▹▹▹▹▸",
|
||||||
|
"▪▪▪▪▪",
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
pb.set_message("Collecting paths...");
|
||||||
|
|
||||||
|
let paths: Vec<_> = WalkDir::new(path)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.flatten()
|
.flatten()
|
||||||
.par_bridge()
|
.filter(|entry| entry.path().extension() == Some(OsStr::new("log")))
|
||||||
.progress_count(2_500_000)
|
.collect();
|
||||||
.for_each(|entry| {
|
|
||||||
|
pb.finish_with_message("Done");
|
||||||
|
|
||||||
|
let bar = ProgressBar::new(paths.len() as u64);
|
||||||
|
bar.set_style(style);
|
||||||
|
|
||||||
|
paths.into_par_iter().progress_with(bar).for_each(|entry| {
|
||||||
let path = entry.path();
|
let path = entry.path();
|
||||||
if path.extension() == Some(OsStr::new("log")) {
|
if path.extension() == Some(OsStr::new("log")) {
|
||||||
// let _ = print!("{} - ", path.display());
|
// let _ = print!("{} - ", path.display());
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,8 @@ 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(#[from] SubjectError),
|
Subject(#[from] SubjectError),
|
||||||
#[error("{0}")]
|
#[error("{0}")]
|
||||||
|
|
@ -82,6 +84,9 @@ pub fn parse_with_handler<Handler: EventHandler>(
|
||||||
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) 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);
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::common::Team;
|
use crate::common::Team;
|
||||||
use crate::parsing::{skip, split_once, split_subject_end};
|
use crate::parsing::{skip, skip_matches, split_once, split_subject_end};
|
||||||
use crate::{Error, Result};
|
use crate::{Error, Result};
|
||||||
use crate::{SubjectError, SubjectId};
|
use crate::{SubjectError, SubjectId};
|
||||||
use chrono::{NaiveDate, NaiveDateTime};
|
use chrono::{NaiveDate, NaiveDateTime};
|
||||||
|
|
@ -25,7 +25,7 @@ impl<'a> RawEvent<'a> {
|
||||||
|
|
||||||
fn event_parser(input: &str) -> Result<RawEvent> {
|
fn event_parser(input: &str) -> Result<RawEvent> {
|
||||||
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]);
|
||||||
|
|
||||||
|
|
@ -33,7 +33,7 @@ fn event_parser(input: &str) -> Result<RawEvent> {
|
||||||
|
|
||||||
let (input, ty) = event_type_parser(input)?;
|
let (input, ty) = event_type_parser(input)?;
|
||||||
|
|
||||||
let params = &input[((!input.is_empty() && ty != RawEventType::Unknown) as usize)..];
|
let params = skip_matches(input, b' ').0;
|
||||||
|
|
||||||
Ok(RawEvent {
|
Ok(RawEvent {
|
||||||
date,
|
date,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue