use clap::{crate_description, crate_name, value_t_or_exit, App, Arg};
use log::*;
use solana_runtime::append_vec::AppendVec;

fn main() {
    solana_logger::setup_with_default("solana=info");
    let matches = App::new(crate_name!())
        .about(crate_description!())
        .version(solana_version::version!())
        .arg(
            Arg::with_name("file")
                .long("file")
                .takes_value(true)
                .value_name("<PATH>")
                .help("store to open"),
        )
        .arg(
            Arg::with_name("len")
                .long("len")
                .takes_value(true)
                .value_name("LEN")
                .help("len of store to open"),
        )
        .get_matches();

    let file = value_t_or_exit!(matches, "file", String);
    let len = value_t_or_exit!(matches, "len", usize);
    let mut store = AppendVec::new_empty_map(len);
    store.set_no_remove_on_drop();
    store.set_file(file).expect("set_file failed");
    let accounts = store.accounts(0);
    info!(
        "store: len: {} capacity: {} accounts: {}",
        store.len(),
        store.capacity(),
        accounts.len()
    );
    for account in store.accounts(0) {
        info!(
            "  account: {:?} version: {} data: {} hash: {:?}",
            account.meta.pubkey, account.meta.write_version, account.meta.data_len, account.hash
        );
    }
}

#[cfg(test)]
pub mod test {}
