use crate::helpers::*;
use crate::{API_KEY_LENGTH, BatchParams, DEFAULT_VERSION};
pub fn encode_batch(params: &BatchParams<'_>) -> Vec<u8> {
let mut buf = Vec::new();
encode_batch_into(&mut buf, params);
buf
}
pub fn encode_batch_into(buf: &mut Vec<u8>, params: &BatchParams<'_>) {
let has_batch_id = params.batch_id != 0;
let version = if params.version == 0 {
DEFAULT_VERSION
} else {
params.version
};
let vtable_size: u16 = 4 + 6 * 2;
let table_size: u16 = 4 + 28;
let api_key_vec_size = 4 + API_KEY_LENGTH;
let data_vec_size = 4 + params.data.len();
let estimated =
4 + vtable_size as usize + table_size as usize + api_key_vec_size + data_vec_size + 16;
buf.reserve(estimated);
let base = buf.len();
buf.extend_from_slice(&[0u8; 4]);
let vtable_start = buf.len();
write_u16(buf, vtable_size);
write_u16(buf, table_size);
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();
let soffset = (table_start - vtable_start) as i32;
write_i32(buf, soffset);
let api_key_off_pos = buf.len();
write_u32(buf, 0);
let data_off_pos = buf.len();
write_u32(buf, 0);
write_u32(buf, 0);
write_u64(buf, params.batch_id);
buf.push(params.schema_type.as_u8());
buf.push(version);
buf.extend_from_slice(&[0u8; 2]);
align4(buf);
let api_key_vec_start = write_byte_vector(buf, params.api_key);
align4(buf);
let data_vec_start = write_byte_vector(buf, params.data);
buf[base..base + 4].copy_from_slice(&(table_start as u32).to_le_bytes());
patch_offset(buf, api_key_off_pos, api_key_vec_start);
patch_offset(buf, data_off_pos, data_vec_start);
}