Skip to main content

systemprompt_models/events/
system_event.rs

1use 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}