dem 0.2.3

GoldSrc demo parser and writer library
Documentation
use bitvec::field::BitField;
use types::BitSlice;

use self::types::{DeltaDecoderS, DeltaType};

use super::*;

pub fn get_initial_delta() -> DeltaDecoderTable {
    let mut res: DeltaDecoderTable = DeltaDecoderTable::new();

    let e1 = DeltaDecoderS {
        name: "flags".into(),
        bits: 32,
        divisor: 1.,
        flags: DeltaType::Integer as u32,
    };
    let e2 = DeltaDecoderS {
        name: "name".into(),
        bits: 8,
        divisor: 1.,
        flags: DeltaType::String as u32,
    };
    let e3 = DeltaDecoderS {
        name: "offset".into(),
        bits: 16,
        divisor: 1.,
        flags: DeltaType::Integer as u32,
    };
    let e4 = DeltaDecoderS {
        name: "size".into(),
        bits: 8,
        divisor: 1.,
        flags: DeltaType::Integer as u32,
    };
    let e5 = DeltaDecoderS {
        name: "bits".into(),
        bits: 8,
        divisor: 1.,
        flags: DeltaType::Integer as u32,
    };
    let e6 = DeltaDecoderS {
        name: "divisor".into(),
        bits: 32,
        divisor: 4000.,
        flags: DeltaType::Float as u32,
    };
    let e7 = DeltaDecoderS {
        name: "preMultiplier".into(),
        bits: 32,
        divisor: 4000.,
        flags: DeltaType::Float as u32,
    };

    let default_decoder = vec![e1, e2, e3, e4, e5, e6, e7];

    res.insert("delta_description_t\0".to_string(), default_decoder);

    res
}

pub fn bitslice_to_string(bitslice: &BitSlice) -> String {
    assert_eq!(bitslice.len() % 8, 0);

    let byte_count = bitslice.len() / 8;
    let mut res_string = String::new();

    for i in 0..byte_count {
        res_string += (bitslice[(i * 8)..((i + 1) * 8)].load::<u8>() as char)
            .to_string()
            .as_str()
    }

    res_string
}

#[cfg(test)]
mod test {
    use bitvec::{bitarr, order::Lsb0};

    use crate::utils::bitslice_to_string;

    #[test]
    fn bit_slice_to_string() {
        let v = bitarr![u8, Lsb0; 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
        let res = bitslice_to_string(v.as_bitslice());

        assert_eq!(res, "*38\0\0\0\0\0")
    }
}