1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
#![allow(clippy::integer_arithmetic)] use crate::pubkey::Pubkey; use crate::sanitize::SanitizeError; pub fn append_u16(buf: &mut Vec<u8>, data: u16) { let start = buf.len(); buf.resize(buf.len() + 2, 0); let end = buf.len(); buf[start..end].copy_from_slice(&data.to_le_bytes()); } pub fn append_u8(buf: &mut Vec<u8>, data: u8) { let start = buf.len(); buf.resize(buf.len() + 1, 0); buf[start] = data; } pub fn append_slice(buf: &mut Vec<u8>, data: &[u8]) { let start = buf.len(); buf.resize(buf.len() + data.len(), 0); let end = buf.len(); buf[start..end].copy_from_slice(data); } pub fn read_u8(current: &mut usize, data: &[u8]) -> Result<u8, SanitizeError> { if data.len() < *current + 1 { return Err(SanitizeError::IndexOutOfBounds); } let e = data[*current]; *current += 1; Ok(e) } pub fn read_pubkey(current: &mut usize, data: &[u8]) -> Result<Pubkey, SanitizeError> { let len = std::mem::size_of::<Pubkey>(); if data.len() < *current + len { return Err(SanitizeError::IndexOutOfBounds); } let e = Pubkey::new(&data[*current..*current + len]); *current += len; Ok(e) } pub fn read_u16(current: &mut usize, data: &[u8]) -> Result<u16, SanitizeError> { if data.len() < *current + 2 { return Err(SanitizeError::IndexOutOfBounds); } let mut fixed_data = [0u8; 2]; fixed_data.copy_from_slice(&data[*current..*current + 2]); let e = u16::from_le_bytes(fixed_data); *current += 2; Ok(e) } pub fn read_slice( current: &mut usize, data: &[u8], data_len: usize, ) -> Result<Vec<u8>, SanitizeError> { if data.len() < *current + data_len { return Err(SanitizeError::IndexOutOfBounds); } let e = data[*current..*current + data_len].to_vec(); *current += data_len; Ok(e) }