use anyhow::Context;
use falco_event::events::RawEvent;
use falco_plugin_api::ss_plugin_event_input;
use std::ffi::CStr;
use std::marker::PhantomData;
#[derive(Debug)]
pub struct EventInput<'a, T>(
pub(crate) ss_plugin_event_input,
pub(crate) PhantomData<fn(&'a T)>,
);
impl<'a, T> EventInput<'a, T>
where
for<'b> T: TryFrom<&'b RawEvent<'a>>,
for<'b> <T as TryFrom<&'b RawEvent<'a>>>::Error: std::error::Error + Send + Sync + 'static,
{
pub fn event(&self) -> anyhow::Result<T> {
let raw = unsafe { RawEvent::from_ptr(self.0.evt as *const _) }?;
let event = Ok(<&RawEvent<'_> as TryInto<T>>::try_into(&raw)
.with_context(|| format!("parsing event {raw:?}"))?);
#[allow(clippy::let_and_return)]
event
}
pub fn source(&self) -> Option<&CStr> {
unsafe {
if self.0.evtsrc.is_null() {
None
} else {
Some(CStr::from_ptr(self.0.evtsrc))
}
}
}
pub fn event_number(&self) -> usize {
self.0.evtnum as usize
}
}