android-sparse 0.3.1

An implementation of Android's sparse file format.
Documentation
extern crate android_sparse as sparse;
#[macro_use]
extern crate clap;

use std::fs::File;
use std::io::BufWriter;

use clap::{App, Arg, ArgMatches};

use sparse::result::Result;

fn parse_args<'a>() -> ArgMatches<'a> {
    App::new("img2simg")
        .about("Encode a raw file to a sparse file")
        .version(crate_version!())
        .author("Jan Teske <jan.teske@gmail.com>")
        .arg(Arg::with_name("raw_file").required(true))
        .arg(Arg::with_name("sparse_file").required(true))
        .arg(
            Arg::with_name("crc")
                .help("Compute the sparse image checksum")
                .short("c")
                .long("crc"),
        )
        .get_matches()
}

fn img2simg(args: &ArgMatches) -> Result<()> {
    let fi = File::open(&args.value_of("raw_file").unwrap())?;
    let fo = File::create(&args.value_of("sparse_file").unwrap())?;

    let writer = BufWriter::new(fo);

    let mut sparse_file = sparse::File::new();
    let encoder = sparse::Encoder::new(fi);

    let mut writer = sparse::Writer::new(writer);
    if args.is_present("crc") {
        writer = writer.with_crc();
    }

    encoder.read(&mut sparse_file)?;
    writer.write(&sparse_file)?;

    Ok(())
}

fn main() {
    let args = parse_args();
    img2simg(&args).unwrap_or_else(|err| eprintln!("error: {}", err));
}