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#[derive(Debug, Clone, Copy)]
69pub struct SystemEventBuilder;
70
71impl SystemEventBuilder {
72 pub fn context_created(context_id: ContextId, name: String) -> SystemEvent {
73 SystemEvent::ContextCreated {
74 timestamp: Utc::now(),
75 payload: ContextCreatedPayload { context_id, name },
76 }
77 }
78
79 pub fn context_updated(context_id: ContextId, name: Option<String>) -> SystemEvent {
80 SystemEvent::ContextUpdated {
81 timestamp: Utc::now(),
82 payload: ContextUpdatedPayload { context_id, name },
83 }
84 }
85
86 pub fn context_deleted(context_id: ContextId) -> SystemEvent {
87 SystemEvent::ContextDeleted {
88 timestamp: Utc::now(),
89 payload: ContextDeletedPayload { context_id },
90 }
91 }
92
93 pub fn contexts_snapshot(contexts: Vec<ContextSummary>) -> SystemEvent {
94 SystemEvent::ContextsSnapshot {
95 timestamp: Utc::now(),
96 payload: ContextsSnapshotPayload { contexts },
97 }
98 }
99
100 pub fn connected(connection_id: String) -> SystemEvent {
101 SystemEvent::Connected {
102 timestamp: Utc::now(),
103 payload: ConnectedPayload { connection_id },
104 }
105 }
106
107 pub fn heartbeat() -> SystemEvent {
108 SystemEvent::Heartbeat {
109 timestamp: Utc::now(),
110 }
111 }
112}