persy_expimp 1.1.0

Export and Import data from Persy single file transactional persistence engine
Documentation
use persy::{Config, Persy};
use persy_expimp::{export_binary, export_json, import_binary, import_json, Error};
use std::fs::OpenOptions;
use std::io::{stdin, stdout, Read, Write};
use std::path::PathBuf;
use structopt::StructOpt;

#[derive(StructOpt)]
#[structopt(
    name = "persy_expimp",
    author = "tglman",
    about = "export or import data from a persy storage"
)]
struct Cli {
    #[structopt(long, short, default_value = "json")]
    format: String,

    #[structopt(long, short)]
    import: bool,

    #[structopt(long, short)]
    export: bool,

    #[structopt(parse(from_os_str))]
    persy_file: PathBuf,

    #[structopt(parse(from_os_str))]
    file: Option<PathBuf>,
}

fn format_export(format: &str, persy: Persy, writer: &mut dyn Write) -> Result<(), Error> {
    match format {
        "JSON" => export_json(&persy, writer)?,
        "BINCODE" => export_binary(&persy, writer)?,
        _ => panic!("supported formats are JSON and bincode format"),
    }
    Ok(())
}

fn format_import(format: &str, persy: Persy, reader: &mut dyn Read) -> Result<(), Error> {
    match format {
        "JSON" => import_json(&persy, reader)?,
        "BINCODE" => import_binary(&persy, reader)?,
        _ => panic!("supported formats are JSON and bincode format"),
    }
    Ok(())
}

pub fn main() -> Result<(), Error> {
    let cli = Cli::from_args();
    let format = cli.format.to_uppercase();
    if format != "JSON" && format != "BINCODE" {
        panic!("supported formats are only JSON and bincode format");
    }

    if cli.export {
        let persy = Persy::open(cli.persy_file.to_str().unwrap(), Config::new())?;
        if let Some(f) = cli.file {
            let mut output = OpenOptions::new().write(true).create(true).open(f)?;
            format_export(&format, persy, &mut output)?;
        } else {
            format_export(&format, persy, &mut stdout())?;
        }
    } else if cli.import {
        Persy::create(cli.persy_file.to_str().unwrap())?;
        let persy = Persy::open(cli.persy_file.to_str().unwrap(), Config::new())?;
        if let Some(f) = cli.file {
            let mut input = OpenOptions::new().read(true).open(f)?;
            format_import(&format, persy, &mut input)?;
        } else {
            format_import(&format, persy, &mut stdin())?;
        }
    } else {
        println!("please specify if export or import");
    }

    Ok(())
}