tario 0.1.2

Asynchronously read and write TAR archives
Documentation
use super::block::{BLOCK_SIZE, Header};

pub fn make_archive_data(entries: &[(&str, usize)]) -> Vec<u8> {
    entries
        .iter()
        .flat_map(|(path, size)| {
            [
                make_entry_header(path, *size).as_bytes().to_vec(),
                make_entry_data(*size),
            ]
            .concat()
        })
        .chain(make_eof_data())
        .collect()
}

pub fn make_entry_header(path: &str, size: usize) -> Header {
    let mut header = Header::new_ustar();
    header.set_path(path).unwrap();
    header.set_size(size as u64);
    header.set_cksum();
    header
}

pub fn make_entry_data(size: usize) -> Vec<u8> {
    let total_size = size.next_multiple_of(BLOCK_SIZE);
    let mut buf = vec![0u8; total_size];

    buf.iter_mut().enumerate().for_each(|(i, b)| {
        if i < size {
            *b = (i.next_multiple_of(u8::MAX as usize) - i) as u8;
        } else {
            *b = 0;
        }
    });

    buf
}

pub fn make_eof_data() -> Vec<u8> {
    vec![0u8; 1024]
}