mrg 0.2.2

A library for parsing and serializing Gravity Defied levels
Documentation
use super::writer::Writer;
use crate::Difficulty;
use anyhow::Result;
use std::iter::zip;

impl Difficulty {
    pub(super) fn to_bytes(
        &self,
        buffer: &mut Vec<u8>,
        track_offsets: &mut Vec<Vec<usize>>,
    ) -> Result<()> {
        let mut offsets = Vec::new();

        for track in &self.tracks {
            offsets.push(buffer.len());
            track.to_bytes(buffer)?;
        }

        track_offsets.push(offsets);

        Ok(())
    }

    pub(super) fn generate_header(
        &self,
        offsets: &Vec<usize>,
        header_size: usize,
    ) -> Result<Vec<u8>> {
        let mut header: Vec<u8> = Vec::new();

        let track_count: i32 = self.tracks.len().try_into()?;
        header.write_int(track_count)?;

        for (offset, track) in zip(offsets, &self.tracks) {
            let offset: i32 = (offset + header_size).try_into()?;
            header.write_int(offset)?;

            header.extend(track.name.as_bytes());

            header.push(0x00);
        }

        Ok(header)
    }
}