use std::collections::VecDeque;
use generic_array::{typenum::U16, GenericArray};
pub(crate) fn chunk_data_for_encryption(data: impl AsRef<[u8]>) -> Vec<GenericArray<u8, U16>> {
let length = data.as_ref().len();
if length % 16 == 0 {
return data.as_ref()
.chunks(16)
.map(|c| GenericArray::clone_from_slice(c))
.collect::<Vec<GenericArray<u8, U16>>>()
} else {
let mut buf = data.as_ref()[..(16*(length/16))]
.chunks(16)
.map(|c| GenericArray::clone_from_slice(c))
.collect::<Vec<GenericArray<u8, U16>>>();
let mut last = GenericArray::from([0u8; 16]);
{
let (left, right) = last.split_at_mut(length%16);
left.copy_from_slice(&data.as_ref()[(length-length%16)..]);
last[15] = right.len() as u8;
}
buf.push(last);
return buf;
}
}
pub(crate) fn chunk_data_for_packet_split(data: impl AsRef<[u8]>, piece_len: usize) -> VecDeque<Vec<u8>> {
let length = data.as_ref().len();
if length % piece_len == 0 {
return data.as_ref()
.chunks(piece_len)
.map(|c| Vec::from(c))
.collect::<VecDeque<Vec<u8>>>()
} else {
let mut buf = data.as_ref()[..(piece_len*(length/piece_len))]
.chunks(piece_len)
.map(|c| Vec::from(c))
.collect::<VecDeque<Vec<u8>>>();
buf.push_back(data.as_ref()[(length-length%piece_len)..].to_vec());
return buf;
}
}