1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3use time::OffsetDateTime;
4
5use crate::EVENT_SCHEMA_VERSION;
6use crate::ids::{EventId, RunId};
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct Event {
10 pub event_id: EventId,
11 pub run_id: RunId,
12 #[serde(with = "time::serde::rfc3339")]
13 pub ts: OffsetDateTime,
14 pub parent_event_id: Option<EventId>,
15 pub kind: String,
16 pub schema_version: u32,
17 pub payload: Value,
18}
19
20impl Event {
21 pub fn new(run_id: RunId, kind: impl Into<String>, payload: Value) -> Self {
22 Self {
23 event_id: EventId::new(),
24 run_id,
25 ts: OffsetDateTime::now_utc(),
26 parent_event_id: None,
27 kind: kind.into(),
28 schema_version: EVENT_SCHEMA_VERSION,
29 payload,
30 }
31 }
32
33 pub fn with_parent(mut self, parent_event_id: EventId) -> Self {
34 self.parent_event_id = Some(parent_event_id);
35 self
36 }
37}