android-sparse 0.6.0

An implementation of Android's sparse file format.
Documentation
extern crate android_sparse as sparse;

mod util;

use crate::util::{data, test_blocks};
use sparse::{Decoder, Writer};
use std::{
    fs::File,
    io::{prelude::*, SeekFrom},
};

fn read_from_start(file: &mut File) -> Vec<u8> {
    let mut result = Vec::new();
    file.seek(SeekFrom::Start(0)).unwrap();
    file.read_to_end(&mut result).unwrap();
    result
}

#[test]
fn write_sparse() {
    let blocks = test_blocks();
    let mut tmpfile = tempfile::tempfile().unwrap();

    let file = tmpfile.try_clone().unwrap();
    let mut writer = Writer::new(file).unwrap();
    for block in &blocks {
        writer.write_block(block).unwrap();
    }
    writer.close().unwrap();

    assert_eq!(read_from_start(&mut tmpfile), data("hello.simg"));
}

#[test]
fn write_sparse_crc() {
    let blocks = test_blocks();
    let mut tmpfile = tempfile::tempfile().unwrap();

    let file = tmpfile.try_clone().unwrap();
    let mut writer = Writer::with_crc(file).unwrap();
    for block in &blocks {
        writer.write_block(block).unwrap();
    }
    writer.close().unwrap();

    assert_eq!(read_from_start(&mut tmpfile), data("crc.simg"));
}

#[test]
fn decode_to_raw() {
    let blocks = test_blocks();
    let mut tmpfile = tempfile::tempfile().unwrap();

    let file = tmpfile.try_clone().unwrap();
    let mut decoder = Decoder::new(file).unwrap();
    for block in &blocks {
        decoder.write_block(block).unwrap();
    }
    decoder.close().unwrap();

    assert_eq!(read_from_start(&mut tmpfile), data("decoded.img"));
}