use facet::Facet;
use moire_trace_types::BacktraceId;
use crate::{EntityId, EventId, Json, PTime, ScopeId, next_event_id};
#[derive(Facet)]
pub struct Event {
pub id: EventId,
pub at: PTime,
pub backtrace: BacktraceId,
pub target: EventTarget,
pub kind: EventKind,
}
impl Event {
pub fn new(target: EventTarget, kind: EventKind, backtrace: BacktraceId) -> Self {
Self {
id: next_event_id(),
at: PTime::now(),
backtrace,
target,
kind,
}
}
}
#[derive(Facet)]
#[repr(u8)]
#[facet(rename_all = "snake_case")]
pub enum EventTarget {
Entity(EntityId),
Scope(ScopeId),
}
#[derive(Facet)]
#[repr(u8)]
#[facet(rename_all = "snake_case")]
pub enum EventKind {
StateChanged,
ChannelSent,
ChannelReceived,
Custom(CustomEventKind),
}
#[derive(Facet)]
pub struct CustomEventKind {
pub kind: String,
pub display_name: String,
pub payload: Json,
}
crate::impl_sqlite_json!(EventTarget);
crate::impl_sqlite_json!(EventKind);
crate::declare_event_target_slots!(
EntityTargetSlot::Entity(EntityId),
ScopeTargetSlot::Scope(ScopeId),
);
crate::declare_event_kind_slots!(
StateChangedKindSlot::StateChanged,
ChannelSentKindSlot::ChannelSent,
ChannelReceivedKindSlot::ChannelReceived,
);
#[derive(Facet)]
pub struct ChannelSentEvent {
pub wait_ns: Option<u64>,
pub closed: bool,
}
#[derive(Facet)]
pub struct ChannelReceivedEvent {
pub wait_ns: Option<u64>,
pub closed: bool,
}