godot_binary_serialization/decoder/
int.rs

1use anyhow::anyhow;
2use byteorder::{ByteOrder, LittleEndian};
3
4use crate::types::{primitive::GodotInteger, SerializeFlag, TYPE_PADDING};
5
6use super::Decoder;
7
8impl Decoder {
9    /// Decodes bytes into a Godot integer
10    pub fn decode_int(bytes: &[u8], flag: &SerializeFlag) -> anyhow::Result<GodotInteger> {
11        Self::decode_raw_int(bytes, 4, flag)
12    }
13
14    /// Uses a serialization flag and the offset in bytes to decode bytes into a Godot integer
15    pub fn decode_raw_int(
16        bytes: &[u8],
17        offset: usize,
18        flag: &SerializeFlag,
19    ) -> anyhow::Result<GodotInteger> {
20        let mut length = 4;
21
22        if flag == &SerializeFlag::Bit64 {
23            length = 8;
24        }
25
26        if bytes.len() < TYPE_PADDING as usize + length {
27            return Err(anyhow!(
28                "Byte slice too short to decode int with flag {flag:?}"
29            ));
30        }
31
32        if flag == &SerializeFlag::Bit64 {
33            return Ok(GodotInteger {
34                value: LittleEndian::read_i64(&bytes[offset..offset + length]),
35                byte_size: TYPE_PADDING as usize + length,
36            });
37        }
38
39        Ok(GodotInteger {
40            value: LittleEndian::read_i32(&bytes[offset..offset + length]) as i64,
41            byte_size: TYPE_PADDING as usize + length,
42        })
43    }
44}
45
46#[cfg(test)]
47mod tests {
48    use crate::decoder::Decoder;
49
50    #[test]
51    fn decode_int32() {
52        let bytes: &[u8] = &[2, 0, 0, 0, 1, 0, 0, 0];
53        let (_type, flag) = Decoder::get_type_and_flags(bytes).unwrap();
54        let int = Decoder::decode_int(bytes, &flag).unwrap();
55
56        assert_eq!(
57            int.value, 1,
58            "Expected value of {} but got {} instead",
59            1, int.value
60        );
61    }
62
63    #[test]
64    fn decode_int64() {
65        let bytes: &[u8] = &[2, 0, 1, 0, 31, 166, 227, 165, 155, 196, 32, 0];
66        let (_type, flag) = Decoder::get_type_and_flags(bytes).unwrap();
67        let int = Decoder::decode_int(bytes, &flag).unwrap();
68        let value = 9223372036875807_i64;
69
70        assert_eq!(
71            int.value, value,
72            "Expected value of {} but got {} instead",
73            value, int.value
74        );
75    }
76}