1use crate::helpers::*;
2use crate::{API_KEY_LENGTH, BatchParams, DEFAULT_VERSION};
3
4pub fn encode_batch(params: &BatchParams<'_>) -> Vec<u8> {
28 let mut buf = Vec::new();
29 encode_batch_into(&mut buf, params);
30 buf
31}
32
33pub fn encode_batch_into(buf: &mut Vec<u8>, params: &BatchParams<'_>) {
35 let has_batch_id = params.batch_id != 0;
36 let version = if params.version == 0 {
37 DEFAULT_VERSION
38 } else {
39 params.version
40 };
41
42 let vtable_size: u16 = 4 + 6 * 2;
44
45 let table_size: u16 = 4 + 28;
48
49 let api_key_vec_size = 4 + API_KEY_LENGTH;
50 let data_vec_size = 4 + params.data.len();
51
52 let estimated =
53 4 + vtable_size as usize + table_size as usize + api_key_vec_size + data_vec_size + 16;
54 buf.reserve(estimated);
55
56 let base = buf.len();
57
58 buf.extend_from_slice(&[0u8; 4]);
60
61 let vtable_start = buf.len();
63 write_u16(buf, vtable_size);
64 write_u16(buf, table_size);
65
66 write_u16(buf, 4); write_u16(buf, 24); write_u16(buf, 25); write_u16(buf, if has_batch_id { 16 } else { 0 }); write_u16(buf, 8); write_u16(buf, 0); let table_start = buf.len();
76 let soffset = (table_start - vtable_start) as i32;
77 write_i32(buf, soffset);
78
79 let api_key_off_pos = buf.len();
81 write_u32(buf, 0);
82
83 let data_off_pos = buf.len();
85 write_u32(buf, 0);
86
87 write_u32(buf, 0);
89
90 write_u64(buf, params.batch_id);
92
93 buf.push(params.schema_type.as_u8());
95
96 buf.push(version);
98
99 buf.extend_from_slice(&[0u8; 2]);
101
102 align4(buf);
104
105 let api_key_vec_start = write_byte_vector(buf, params.api_key);
107
108 align4(buf);
109
110 let data_vec_start = write_byte_vector(buf, params.data);
112
113 buf[base..base + 4].copy_from_slice(&(table_start as u32).to_le_bytes());
115 patch_offset(buf, api_key_off_pos, api_key_vec_start);
116 patch_offset(buf, data_off_pos, data_vec_start);
117}