probabilistic_data_structures 0.1.0

Probabilistic data structures in Rust Lang.
Documentation
use better_panic;
use log::info;

extern crate probabilistic_data_structures;

pub mod lib;

fn main() -> std::io::Result<()> {
    std::env::set_var("RUST_BACKTRACE", "1");
    std::env::set_var("RUST_LOG", "trace");

    better_panic::Settings::debug()
        .most_recent_first(true)
        .backtrace_first(true)
        .lineno_suffix(true)
        .verbosity(better_panic::Verbosity::Full)
        .install();

    let (width, height) = lib::terminal_utils::dimensions_or_exit();
    let separator: String =
        "-".repeat((width - "[2020-08-20T10:11:28Z INFO  main] ".len()) as usize);
    // https://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html
    const COLOUR_BORDER: &str = "\x1b[44m";
    const RESET: &str = "\x1b[0m";

    let cli = lib::cli::new();

    #[allow(unused_assignments)]
    let mut log_level = cli.log_level.as_str();
    log_level = "debug";
    let rust_log = format!("{}", log_level);
    std::env::set_var("RUST_LOG", rust_log);
    env_logger::init();

    info!("main: cli={:?}, width={:?}, height={:?}", cli, width, height);
    info!("{}{}{}", COLOUR_BORDER, separator, RESET);

    {
        let pkg_name = env!("CARGO_PKG_NAME");
        let pkg_version = env!("CARGO_PKG_VERSION");
        let pkg_repository = env!("CARGO_PKG_REPOSITORY");
        info!("main: {}@{} -> {}", pkg_name, pkg_version, pkg_repository);
    }

    let lines: Vec<String> = read_lines()?;
    // debug!("main: lines={:?}", lines);

    let mut pcsa = probabilistic_data_structures::pcsa::PCSA::new();
    for line in lines {
        pcsa.add(line)?;
    }

    info!("main: pcsa={:?}", pcsa);
    info!("main: pcsa.count()={:?}", pcsa.cardinality());

    info!("{}{}{}", COLOUR_BORDER, separator, RESET);

    Ok(())
}

fn read_lines() -> std::io::Result<Vec<String>> {
    use std::{
        fs::File,
        io::{prelude::*, BufReader},
    };

    let file = File::open("testdata/countdistinct/elements.txt")?;
    let reader = BufReader::new(file);

    let mut lines: Vec<String> = Vec::new();
    for line in reader.lines() {
        let l = line?;
        // println!("main.read_lines: line={}", l);
        lines.push(l);
    }

    Ok(lines)
}