use anyhow::Context as _;
use super::Context;
use crate::kernel::{ClassifyResult, EventOps, Result};
pub fn emit_event(
context: Context<'_, impl EventOps>,
event_off: u32,
event_len: u32,
key_off: u32,
key_len: u32,
val_off: u32,
val_len: u32,
) -> Result<()> {
let event_headers = unsafe {
const EVENT_SIZE: u32 = std::mem::size_of::<fvm_shared::sys::EventEntry>() as u32;
static_assertions::assert_eq_align!(fvm_shared::sys::EventEntry, u8);
let size = event_len
.checked_mul(EVENT_SIZE)
.context("events index out of bounds")
.or_illegal_argument()?;
let buf = context.memory.try_slice(event_off, size)?;
std::slice::from_raw_parts(
buf.as_ptr() as *const fvm_shared::sys::EventEntry,
event_len as usize,
)
};
let raw_key = context.memory.try_slice(key_off, key_len)?;
let raw_val = context.memory.try_slice(val_off, val_len)?;
context.kernel.emit_event(event_headers, raw_key, raw_val)
}