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