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