use crate::parse::EventInput;
use crate::plugin::base::Plugin;
use crate::plugin::error::last_error::LastError;
use crate::plugin::parse::wrappers::ParsePluginExported;
use crate::plugin::tables::vtable::writer::LazyTableWriter;
use crate::tables::LazyTableReader;
use falco_event::events::{AnyEventPayload, RawEvent};
use falco_plugin_api::ss_plugin_event_parse_input;
#[doc(hidden)]
pub mod wrappers;
pub trait ParsePlugin: Plugin + ParsePluginExported {
type Event<'a>: AnyEventPayload + TryFrom<&'a RawEvent<'a>>
where
Self: 'a;
fn parse_event(
&mut self,
event: &EventInput<Self::Event<'_>>,
parse_input: &ParseInput,
) -> anyhow::Result<()>;
}
#[derive(Debug)]
pub struct ParseInput<'t> {
pub reader: LazyTableReader<'t>,
pub writer: LazyTableWriter<'t>,
}
impl ParseInput<'_> {
pub(in crate::plugin::parse) unsafe fn try_from(
value: *const ss_plugin_event_parse_input,
last_error: LastError,
) -> Result<Self, anyhow::Error> {
let input = unsafe {
value
.as_ref()
.ok_or_else(|| anyhow::anyhow!("Got null event parse input"))?
};
let reader = unsafe {
input
.table_reader_ext
.as_ref()
.ok_or_else(|| anyhow::anyhow!("Got null reader vtable"))?
};
let writer = unsafe {
input
.table_writer_ext
.as_ref()
.ok_or_else(|| anyhow::anyhow!("Got null writer vtable"))?
};
let reader = LazyTableReader::new(reader, last_error.clone());
let writer = LazyTableWriter::try_from(writer, last_error)?;
Ok(Self { reader, writer })
}
}