use std::{any::Any, fmt::Debug, sync::Arc};
use serde::{Serialize, de::DeserializeOwned};
use serde_json::Value;
use crate::common::with_id::WithId;
pub trait AnyItem: WithId + erased_serde::Serialize + Any + Debug + Send + Sync + 'static {
fn as_any(&self) -> &dyn Any;
fn entity_type(&self) -> &'static str;
fn equals(&self, other: &dyn AnyItem) -> bool;
}
erased_serde::serialize_trait_object!(AnyItem);
impl PartialEq for dyn AnyItem {
fn eq(&self, other: &Self) -> bool {
self.equals(other)
}
}
impl Eq for dyn AnyItem {}
inventory::collect!(ItemRegistration);
pub type ItemParseFn = fn(Value) -> Result<Arc<dyn AnyItem>, anyhow::Error>;
pub struct ItemRegistration {
pub entity_type: &'static str,
pub crate_name: &'static str,
pub parse: ItemParseFn,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum IngestBufferPolicy {
#[default]
None,
TimeWindow {
window_ms: u64,
},
}
pub struct IngestBufferRegistration {
pub entity_type: &'static str,
pub policy: IngestBufferPolicy,
}
inventory::collect!(IngestBufferRegistration);
pub trait Eventable:
AnyItem + Serialize + DeserializeOwned + Clone + PartialEq + Sized + Any
{
const ENTITY_NAME_STATIC: &'static str;
fn entity_name_static() -> &'static str {
Self::ENTITY_NAME_STATIC
}
fn ingest_buffer_policy() -> IngestBufferPolicy {
IngestBufferPolicy::None
}
fn parse(value: Value) -> Result<Arc<dyn AnyItem>, anyhow::Error> {
let item = serde_json::from_value::<Self>(value)?;
Ok(Arc::new(item))
}
}