hpl_toolkit/utils/
bpf_writer.rs

1use anchor_lang::solana_program::program_memory::sol_memcpy;
2use std::cmp;
3use std::io::{self, Write};
4
5#[derive(Debug, Default)]
6pub struct BpfWriter<T> {
7    inner: T,
8    pos: u64,
9}
10
11impl<T> BpfWriter<T> {
12    pub fn new(inner: T) -> Self {
13        Self { inner, pos: 0 }
14    }
15}
16
17impl Write for BpfWriter<&mut [u8]> {
18    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
19        if self.pos >= self.inner.len() as u64 {
20            return Ok(0);
21        }
22
23        let amt = cmp::min(
24            self.inner.len().saturating_sub(self.pos as usize),
25            buf.len(),
26        );
27        sol_memcpy(&mut self.inner[(self.pos as usize)..], buf, amt);
28        self.pos += amt as u64;
29        Ok(amt)
30    }
31
32    fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
33        if self.write(buf)? == buf.len() {
34            Ok(())
35        } else {
36            Err(io::Error::new(
37                io::ErrorKind::WriteZero,
38                "failed to write whole buffer",
39            ))
40        }
41    }
42
43    fn flush(&mut self) -> io::Result<()> {
44        Ok(())
45    }
46}