ddsi_log_parser 0.1.2

Utility to parse ddsi2 logs.
Documentation
use indicatif::{ProgressBar, ProgressStyle};
use regex::Captures;
use std::collections::HashMap;
use std::error::Error;
use std::fs::{metadata, File};
use std::io::{self, prelude::*, BufReader};

mod ddsi_log_regex;
mod ddsi_participant;
mod ddsi_topology;

pub trait DdsiLogConfig {
    fn get_filename(&self) -> &str;
    fn get_output(&self) -> &str;
}

pub fn run<T>(config: &T) -> Result<(), Box<dyn Error>>
where
    T: DdsiLogConfig,
{
    println!(
        "Processing '{}' and storing results in '{}'.",
        &config.get_filename(),
        &config.get_output(),
    );

    let summary = generate_summary(&config.get_filename());

    println!("Writing summary to {}", &config.get_output());

    let mut file = File::create(&config.get_output())?;
    file.write_all(summary.as_bytes())?;

    Ok(())
}

fn generate_summary(filename: &str) -> String {
    let ddsi_log_regex = ddsi_log_regex::DdsiLogRegex::new();

    let file = File::open(filename).unwrap();

    let n_lines = metadata(filename).unwrap().len();

    let reader = BufReader::new(file);

    let mut ddsi_topology = ddsi_topology::DdsiTopology::new();

    println!("Processing {} lines", n_lines);

    let bar = ProgressBar::new(n_lines);

    bar.set_style(
        ProgressStyle::default_bar()
            .template("[{elapsed}] {bar:40.cyan/blue} {eta} {msg}")
            .progress_chars("##-"),
    );

    let mut n_matcher = 0;

    for line in reader.lines() {
        let line_data = &line.unwrap();

        if let Some(dds_log_type) = ddsi_log_regex.parse(line_data) {
            ddsi_topology.update(dds_log_type);
            n_matcher += 1;
        }
        bar.inc(line_data.len() as u64);
    }
    bar.finish();

    println!("Generating summary.");
    let summary = ddsi_topology.summarize();

    println!("Saving ddsi_topology.");

    let serialized = serde_json::to_string(&ddsi_topology).unwrap();

    let mut file = File::create("ddsi_topology.json").unwrap();
    file.write_all(serialized.as_bytes()).unwrap();

    format!(
        "Summary:\n\
        \t- Found {} lines matching ddsi logs.\n\
        {}",
        n_matcher, summary,
    )
}