systemprompt_models/events/
system_event.rs1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use systemprompt_identifiers::ContextId;
4
5use super::payloads::system::{
6 ConnectedPayload, ContextCreatedPayload, ContextDeletedPayload, ContextSummary,
7 ContextUpdatedPayload, ContextsSnapshotPayload,
8};
9use super::system_event_type::SystemEventType;
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
12#[serde(tag = "type", rename_all = "SCREAMING_SNAKE_CASE")]
13pub enum SystemEvent {
14 ContextCreated {
15 timestamp: DateTime<Utc>,
16 #[serde(flatten)]
17 payload: ContextCreatedPayload,
18 },
19 ContextUpdated {
20 timestamp: DateTime<Utc>,
21 #[serde(flatten)]
22 payload: ContextUpdatedPayload,
23 },
24 ContextDeleted {
25 timestamp: DateTime<Utc>,
26 #[serde(flatten)]
27 payload: ContextDeletedPayload,
28 },
29 ContextsSnapshot {
30 timestamp: DateTime<Utc>,
31 #[serde(flatten)]
32 payload: ContextsSnapshotPayload,
33 },
34 Connected {
35 timestamp: DateTime<Utc>,
36 #[serde(flatten)]
37 payload: ConnectedPayload,
38 },
39 Heartbeat {
40 timestamp: DateTime<Utc>,
41 },
42}
43
44impl SystemEvent {
45 pub const fn event_type(&self) -> SystemEventType {
46 match self {
47 Self::ContextCreated { .. } => SystemEventType::ContextCreated,
48 Self::ContextUpdated { .. } => SystemEventType::ContextUpdated,
49 Self::ContextDeleted { .. } => SystemEventType::ContextDeleted,
50 Self::ContextsSnapshot { .. } => SystemEventType::ContextsSnapshot,
51 Self::Connected { .. } => SystemEventType::Connected,
52 Self::Heartbeat { .. } => SystemEventType::Heartbeat,
53 }
54 }
55
56 pub const fn timestamp(&self) -> DateTime<Utc> {
57 match self {
58 Self::ContextCreated { timestamp, .. }
59 | Self::ContextUpdated { timestamp, .. }
60 | Self::ContextDeleted { timestamp, .. }
61 | Self::ContextsSnapshot { timestamp, .. }
62 | Self::Connected { timestamp, .. }
63 | Self::Heartbeat { timestamp } => *timestamp,
64 }
65 }
66
67}
68
69#[derive(Debug, Clone, Copy)]
70pub struct SystemEventBuilder;
71
72impl SystemEventBuilder {
73 pub fn context_created(context_id: ContextId, name: String) -> SystemEvent {
74 SystemEvent::ContextCreated {
75 timestamp: Utc::now(),
76 payload: ContextCreatedPayload { context_id, name },
77 }
78 }
79
80 pub fn context_updated(context_id: ContextId, name: Option<String>) -> SystemEvent {
81 SystemEvent::ContextUpdated {
82 timestamp: Utc::now(),
83 payload: ContextUpdatedPayload { context_id, name },
84 }
85 }
86
87 pub fn context_deleted(context_id: ContextId) -> SystemEvent {
88 SystemEvent::ContextDeleted {
89 timestamp: Utc::now(),
90 payload: ContextDeletedPayload { context_id },
91 }
92 }
93
94 pub fn contexts_snapshot(contexts: Vec<ContextSummary>) -> SystemEvent {
95 SystemEvent::ContextsSnapshot {
96 timestamp: Utc::now(),
97 payload: ContextsSnapshotPayload { contexts },
98 }
99 }
100
101 pub fn connected(connection_id: String) -> SystemEvent {
102 SystemEvent::Connected {
103 timestamp: Utc::now(),
104 payload: ConnectedPayload { connection_id },
105 }
106 }
107
108 pub fn heartbeat() -> SystemEvent {
109 SystemEvent::Heartbeat {
110 timestamp: Utc::now(),
111 }
112 }
113}