ow_blob_codec 0.1.2

Convert xml files to EIP4844 BLOB
Documentation
use c_kzg::BYTES_PER_FIELD_ELEMENT;
use miniz_oxide::deflate::compress_to_vec;
use std::error::Error;
use std::path::Path;
use std::{fs::File, io::Read};

const RAW_CHUNK_SIZE: usize = BYTES_PER_FIELD_ELEMENT - 1;

pub fn file_to_vec(path: &Path) -> Result<Vec<u8>, Box<dyn Error>> {
    let mut file = File::open(path)?;

    let mut file_buffer = Vec::new();
    file.read_to_end(&mut file_buffer)?;

    file_buffer = compress_to_vec(&file_buffer, 10);

    let mut encoded = Vec::new();
    let mut cursor = 0;

    for chunk in file_buffer.chunks(RAW_CHUNK_SIZE) {
        if cursor + RAW_CHUNK_SIZE >= file_buffer.len() {
            encoded.push(1u8);
            encoded.extend_from_slice(chunk);
            let cell_padding = RAW_CHUNK_SIZE - chunk.len();
            if cell_padding > 0 {
                encoded.extend(std::iter::repeat(0).take(cell_padding));
            }
        } else {
            encoded.push(0u8);
            encoded.extend_from_slice(chunk);
        }
        cursor += RAW_CHUNK_SIZE;
    }

    Ok(encoded)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn encoded_file_is_smaller() {
        let path = Path::new("./tests/assets/valid_xml/ERN_example_1.xml");
        let mut file = File::open(path).unwrap();
        let mut file_buffer = Vec::new();
        file.read_to_end(&mut file_buffer).unwrap();

        let encoded = file_to_vec(path).unwrap();

        assert!(encoded.len() < file_buffer.len());
    }
}