d4tools 0.3.9

The CLI utils for D4 file format
Documentation
use clap::{load_yaml, App, ArgMatches};
use d4::index::{D4IndexCollection, Sum};

use d4tools::AppResult;

fn build_main(args: &ArgMatches) -> AppResult<()> {
    let input_path = args.value_of("FILE").unwrap();
    let mut index_collection = D4IndexCollection::open_for_write(input_path)?;
    if args.is_present("secondary-frame") {
        log::info!("Creating SFI");
        index_collection.create_secondary_frame_index()?;
        log::info!("Finish creating SFI");
    }
    if args.is_present("sum") {
        if !args.is_present("secondary-frame") {
            index_collection.create_secondary_frame_index().ok();
        }
        index_collection.create_sum_index()?;
    }
    Ok(())
}

fn show_main(args: &ArgMatches) -> AppResult<()> {
    let input_path = args.value_of("FILE").unwrap();
    let index_collection = D4IndexCollection::from_reader(std::fs::File::open(input_path)?)?;
    match args.value_of("INDEX_TYPE").unwrap().to_lowercase().as_str() {
        "sfi" => {
            let index = index_collection.load_seconary_frame_index()?;
            index.print_secondary_table_index(std::io::stdout())?;
        }
        "sum" => {
            let index = index_collection.load_data_index::<Sum>()?;
            index.print_index();
        }
        _ => {
            panic!("Unsupported index type")
        }
    }
    Ok(())
}

fn main_impl(args: ArgMatches) -> AppResult<bool> {
    if let Some(matches) = args.subcommand_matches("build") {
        build_main(matches)?;
        return Ok(true);
    } else if let Some(matches) = args.subcommand_matches("show") {
        show_main(matches)?;
        return Ok(true);
    }
    Ok(false)
}

pub fn entry_point(args: Vec<String>) -> AppResult<()> {
    let yaml = load_yaml!("cli.yml");
    let mut app = App::from_yaml(yaml).version(d4tools::VERSION);

    let matches = app.clone().get_matches_from(args);

    if !main_impl(matches)? {
        app.print_long_help()?;
    }
    Ok(())
}