dem 0.3.0

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

impl Doer for SvcEventReliable {
    fn id(&self) -> u8 {
        21
    }

    fn parse<'a>(i: &'a [u8], aux: &mut DemoGlobalState) -> NomResult<'a, Self> {
        let mut br = BitReader::new(i);

        let event_index = br.read_n_bit(10).to_u16();
        let event_args = parse_delta(aux.delta_decoders.get("event_t\0").unwrap(), &mut br);
        let has_fire_time = br.read_1_bit();
        let fire_time = if has_fire_time {
            Some(br.read_n_bit(16).to_u16())
        } else {
            None
        };

        let range = br.get_consumed_bytes();
        let (i, _) = take(range)(i)?;

        Ok((
            i,
            Self {
                event_index,
                event_args,
                has_fire_time,
                fire_time,
            },
        ))
    }

    fn write(&self, aux: &DemoGlobalState) -> ByteVec {
        let mut writer = ByteWriter::new();
        let mut bw = BitWriter::new();

        writer.append_u8(self.id());

        bw.append_u10(self.event_index);

        write_delta(
            &self.event_args,
            aux.delta_decoders.get("event_t\0").unwrap(),
            &mut bw,
        );

        bw.append_bit(self.has_fire_time);
        if self.has_fire_time {
            bw.append_u16(self.fire_time.unwrap());
        }

        writer.append_u8_slice(&bw.get_u8_vec());

        writer.data
    }
}