use crate::{
derive::SealCall, result::ExecResult, Builder, Error, Instance, Memory, Result, Value,
};
use ceres_std::Vec;
use ceres_support::traits::Ext;
pub struct Executor<T> {
pub memory: Memory,
instance: Instance<T>,
}
impl<T> Executor<T>
where
T: Ext<Memory, Vec<SealCall<T>>>,
{
pub fn new(code: [u8; 32], sandbox: &mut T) -> Result<Self> {
let memory = sandbox.memory().ok_or(Error::MemoryNotFound)?;
let mut builder = Builder::new().add_host_parcels(sandbox.seal_call());
builder.add_memory("env", "memory", memory.clone());
let wasm = sandbox.code(code).ok_or(Error::CodeNotFound)?.to_vec();
Ok(Self {
memory,
instance: Instance::new(&wasm, &builder, sandbox)?,
})
}
pub fn invoke(&mut self, method: &str, data: &[Value], sandbox: &mut T) -> Result<ExecResult> {
let res = ExecResult::from_res(self.instance.invoke(method, data, sandbox));
if let Ok(r) = res.clone() {
log::debug!("{:?}", &r.data);
}
res
}
}