godot_binary_serialization/decoder/
int.rs1use anyhow::anyhow;
2use byteorder::{ByteOrder, LittleEndian};
3
4use crate::types::{primitive::GodotInteger, SerializeFlag, TYPE_PADDING};
5
6use super::Decoder;
7
8impl Decoder {
9 pub fn decode_int(bytes: &[u8], flag: &SerializeFlag) -> anyhow::Result<GodotInteger> {
11 Self::decode_raw_int(bytes, 4, flag)
12 }
13
14 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}