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