dem 0.2.3

GoldSrc demo parser and writer library
Documentation
use super::*;

impl Doer for SvcSpawnStatic {
    fn id(&self) -> u8 {
        20
    }

    fn parse(i: &[u8], _: AuxRefCell) -> Result<Self> {
        let (
            i,
            (
                model_index,
                sequence,
                frame,
                color_map,
                skin,
                origin_x,
                rotation_x,
                origin_y,
                rotation_y,
                origin_z,
                rotation_z,
                has_render_mode,
            ),
        ) = tuple((
            le_i16, le_i8, le_i8, le_i16, le_i8, le_i16, le_i8, le_i16, le_i8, le_i16, le_i8, le_i8,
        ))(i)?;

        let (i, render_color) = if has_render_mode != 0 {
            map(take(3usize), |what: &[u8]| Some(what.to_vec()))(i)?
        } else {
            (i, None)
        };

        Ok((
            i,
            SvcSpawnStatic {
                model_index,
                sequence,
                frame,
                color_map,
                skin,
                origin_x,
                rotation_x,
                origin_y,
                rotation_y,
                origin_z,
                rotation_z,
                has_render_mode,
                render_color,
            },
        ))
    }

    fn write(&self, _: AuxRefCell) -> ByteVec {
        let mut writer = ByteWriter::new();

        writer.append_u8(self.id());

        writer.append_i16(self.model_index);
        writer.append_i8(self.sequence);
        writer.append_i8(self.frame);
        writer.append_i16(self.color_map);
        writer.append_i8(self.skin);
        writer.append_i16(self.origin_x);
        writer.append_i8(self.rotation_x);
        writer.append_i16(self.origin_y);
        writer.append_i8(self.rotation_y);
        writer.append_i16(self.origin_z);
        writer.append_i8(self.rotation_z);
        writer.append_i8(self.has_render_mode);

        if self.has_render_mode != 0 {
            writer.append_u8_slice(self.render_color.as_ref().unwrap());
        }

        writer.data
    }
}