solana_workflow/instructions/
writer.rs

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