bdflib 0.4.4

A library to parse bdf files.
Documentation
#[cfg(test)]
mod tests {

    use super::io::BDFWriter;
    use crate::chunks::{DataEntry, HashEntry};
    use crate::io::BDFReader;
    use std::fs::{remove_file, File};
    use std::io::Error;

    const FOO: &str = "foo";
    const BAR: &str = "bar";

    #[test]
    fn it_writes_uncompressed() -> Result<(), Error> {
        let mut writer = new_writer("tmp1.bdf", 2, false)?;
        writer.set_entries_per_chunk(24)?;

        writer.add_lookup_entry(HashEntry::new(BAR.to_string(), 5))?;
        writer.add_lookup_entry(HashEntry::new(FOO.to_string(), 4))?;

        let mut entry_1 = DataEntry::new("lol".to_string());
        entry_1.add_hash_value(FOO.to_string(), vec![0, 1, 0, 2]);
        entry_1.add_hash_value(BAR.to_string(), vec![0, 2, 3, 4, 5]);
        writer.add_data_entry(entry_1)?;

        let mut entry_2 = DataEntry::new("lel".to_string());
        entry_2.add_hash_value(BAR.to_string(), vec![0, 3, 2, 1, 5]);
        entry_2.add_hash_value(FOO.to_string(), vec![4, 5, 2, 3]);
        writer.add_data_entry(entry_2)?;

        writer.finish()?;
        remove_file("tmp1.bdf")?;

        Ok(())
    }

    #[test]
    fn it_writes_compressed() -> Result<(), Error> {
        let mut writer = new_writer("tmp2.bdf", 4, true)?;
        writer.set_compression_level(3);
        writer.set_entries_per_chunk(3)?;

        writer.add_lookup_entry(HashEntry::new(FOO.to_string(), 4))?;
        writer.add_lookup_entry(HashEntry::new(BAR.to_string(), 5))?;

        let mut entry_1 = DataEntry::new("lol".to_string());
        entry_1.add_hash_value(FOO.to_string(), vec![2, 4, 0, 2]);
        entry_1.add_hash_value(BAR.to_string(), vec![5, 2, 1, 4, 5]);
        writer.add_data_entry(entry_1)?;

        let mut entry_2 = DataEntry::new("lel".to_string());
        entry_2.add_hash_value(BAR.to_string(), vec![0, 3, 2, 1, 5]);
        entry_2.add_hash_value(FOO.to_string(), vec![4, 5, 2, 3]);
        writer.add_data_entry(entry_2)?;

        let mut entry_3 = DataEntry::new("lool".to_string());
        entry_3.add_hash_value(BAR.to_string(), vec![1, 3, 2, 1, 5]);
        entry_3.add_hash_value(FOO.to_string(), vec![5, 5, 2, 3]);
        writer.add_data_entry(entry_3)?;

        let mut entry_4 = DataEntry::new("lool".to_string());
        entry_4.add_hash_value(BAR.to_string(), vec![1, 3, 2, 1, 5]);
        entry_4.add_hash_value(FOO.to_string(), vec![5, 5, 2, 3]);
        writer.add_data_entry(entry_4)?;

        writer.finish()?;

        remove_file("tmp2.bdf")?;

        Ok(())
    }

    #[test]
    fn it_reads() -> Result<(), Error> {
        create_simple_file("tmp3.bdf", false)?;
        let mut reader = new_reader("tmp3.bdf")?;
        reader.read_start()?;
        let lookup_table = &reader.lookup_table.clone().unwrap();
        let mut next_chunk = reader.next_chunk()?;
        let data_entries = next_chunk.data_entries(lookup_table)?;
        assert_eq!(data_entries[0].plain, "lol".to_string());

        remove_file("tmp3.bdf")?;

        Ok(())
    }

    #[test]
    fn it_reads_compressed() -> Result<(), Error> {
        create_simple_file("tmp4.bdf", true)?;
        let mut reader = new_reader("tmp4.bdf")?;
        reader.read_metadata()?;
        let lookup_table = &reader.read_lookup_table()?.clone();
        let mut next_chunk = reader.next_chunk()?;
        let data_entries = next_chunk.data_entries(lookup_table)?;
        assert_eq!(data_entries[0].plain, "lol".to_string());

        remove_file("tmp4.bdf")?;

        Ok(())
    }

    fn create_simple_file(name: &str, compressed: bool) -> Result<(), Error> {
        let mut writer = new_writer(name, 1, compressed)?;

        writer.add_lookup_entry(HashEntry::new(FOO.to_string(), 4))?;
        let mut entry_1 = DataEntry::new("lol".to_string());
        entry_1.add_hash_value(FOO.to_string(), vec![2, 4, 0, 2]);
        writer.add_data_entry(entry_1)?;

        writer.finish()?;

        Ok(())
    }

    fn new_reader(file_name: &str) -> Result<BDFReader, Error> {
        let file = File::open(file_name)?;

        Ok(BDFReader::new(file))
    }

    fn new_writer(file_name: &str, entries: u64, compress: bool) -> Result<BDFWriter, Error> {
        let file = File::create(file_name)?;

        Ok(BDFWriter::new(file, entries, compress))
    }
}

pub mod chunks;
pub mod io;