solana_workflow/instructions/
writer.rs1use anchor_lang::solana_program::program_memory::sol_memcpy;
2use std::cmp;
3use std::io::{self, Write};
4
5#[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}