solana_serialize_utils/
lib.rs

1//! Helpers for reading and writing bytes.
2
3#![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}