use crate::plugin::base::metrics::Metric;
use crate::plugin::base::wrappers::BasePluginExported;
use crate::plugin::error::last_error::LastError;
use crate::plugin::schema::ConfigSchema;
use crate::plugin::tables::vtable::TablesInput;
use crate::strings::cstring_writer::WriteIntoCString;
use falco_plugin_api::ss_plugin_metric;
use std::ffi::{CStr, CString};
use std::fmt::Display;
use std::io::Write;
mod logger;
pub mod metrics;
#[doc(hidden)]
pub mod wrappers;
pub(crate) struct ActualPlugin<P: Plugin> {
pub(crate) plugin: P,
pub(crate) last_error: LastError,
}
#[doc(hidden)]
pub struct PluginWrapper<P: Plugin> {
pub(crate) plugin: Option<ActualPlugin<P>>,
pub(crate) error_buf: CString,
pub(crate) field_storage: bumpalo::Bump,
pub(crate) string_storage: CString,
pub(crate) metric_storage: Vec<ss_plugin_metric>,
}
impl<P: Plugin> PluginWrapper<P> {
pub fn new(plugin: P, last_error: LastError) -> Self {
Self {
plugin: Some(ActualPlugin { plugin, last_error }),
error_buf: Default::default(),
field_storage: bumpalo::Bump::new(),
string_storage: Default::default(),
metric_storage: Default::default(),
}
}
pub fn new_error(err: impl Display) -> Self {
let mut plugin = Self {
plugin: None,
error_buf: Default::default(),
field_storage: bumpalo::Bump::new(),
string_storage: Default::default(),
metric_storage: vec![],
};
plugin
.error_buf
.write_into(|buf| write!(buf, "{err}"))
.unwrap_or_else(|err| panic!("Failed to write error message (was: {err})"));
plugin
}
}
pub trait Plugin: BasePluginExported + Sized {
const NAME: &'static CStr;
const PLUGIN_VERSION: &'static CStr;
const DESCRIPTION: &'static CStr;
const CONTACT: &'static CStr;
type ConfigType: ConfigSchema;
fn new(input: Option<&TablesInput>, config: Self::ConfigType) -> Result<Self, anyhow::Error>;
fn set_config(&mut self, _config: Self::ConfigType) -> Result<(), anyhow::Error> {
Ok(())
}
fn get_metrics(&mut self) -> impl IntoIterator<Item = Metric> {
[]
}
}