use serde::{de::DeserializeOwned, Deserialize, Serialize};
use sp1_core_executor::SP1RecursionProof;
use sp1_hypercube::{MachineVerifyingKey, SP1PcsProofInner};
use sp1_primitives::SP1GlobalContext;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SP1Stdin {
pub buffer: Vec<Vec<u8>>,
pub ptr: usize,
pub proofs: Vec<(
SP1RecursionProof<SP1GlobalContext, SP1PcsProofInner>,
MachineVerifyingKey<SP1GlobalContext>,
)>,
}
impl SP1Stdin {
pub const fn new() -> Self {
Self { buffer: Vec::new(), ptr: 0, proofs: Vec::new() }
}
pub fn from(data: &[u8]) -> Self {
Self { buffer: vec![data.to_vec()], ptr: 0, proofs: Vec::new() }
}
pub fn read<T: DeserializeOwned>(&mut self) -> T {
let result: T =
bincode::deserialize(&self.buffer[self.ptr]).expect("failed to deserialize");
self.ptr += 1;
result
}
pub fn read_slice(&mut self, slice: &mut [u8]) {
slice.copy_from_slice(&self.buffer[self.ptr]);
self.ptr += 1;
}
pub fn write<T: Serialize>(&mut self, data: &T) {
let mut tmp = Vec::new();
bincode::serialize_into(&mut tmp, data).expect("serialization failed");
self.buffer.push(tmp);
}
pub fn write_slice(&mut self, slice: &[u8]) {
self.buffer.push(slice.to_vec());
}
pub fn write_vec(&mut self, vec: Vec<u8>) {
self.buffer.push(vec);
}
pub fn write_proof(
&mut self,
proof: SP1RecursionProof<SP1GlobalContext, SP1PcsProofInner>,
vk: MachineVerifyingKey<SP1GlobalContext>,
) {
self.proofs.push((proof, vk));
}
}