cardinal_wasm_plugins/
utils.rs

1use crate::SharedExecutionContext;
2use cardinal_errors::internal::CardinalInternalError;
3use cardinal_errors::CardinalError;
4use cardinal_errors::CardinalError::InternalError;
5use wasmer::{FunctionEnvMut, MemoryView};
6
7pub(crate) fn with_mem_view<'a>(
8    ctx: &'a FunctionEnvMut<SharedExecutionContext>,
9) -> Result<MemoryView<'a>, CardinalError> {
10    let inner = ctx.data().read();
11    let mem = inner.memory().as_ref().ok_or_else(|| {
12        InternalError(CardinalInternalError::InvalidWasmModule(
13            "memory not set".into(),
14        ))
15    })?;
16    Ok(mem.view(ctx))
17}
18
19pub fn read_bytes(view: &MemoryView, ptr: i32, len: i32) -> Result<Vec<u8>, CardinalError> {
20    let mut buf = vec![0u8; len as usize];
21    view.read(ptr as u64, &mut buf)
22        .map_err(|e| InternalError(CardinalInternalError::InvalidWasmModule(e.to_string())))?;
23    Ok(buf)
24}
25
26pub fn write_bytes(view: &MemoryView, ptr: i32, data: &[u8]) -> Result<(), CardinalError> {
27    view.write(ptr as u64, data)
28        .map_err(|e| InternalError(CardinalInternalError::InvalidWasmModule(e.to_string())))
29}