use super::traits::EventType;
use super::{MessageEvent, ToolCallEvent, ToolResultEvent};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EventEnvelope {
pub event_id: String,
pub event_type: EventType,
pub session_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub project_hash: Option<String>,
pub timestamp_ms: u64,
pub sequence: u32,
pub payload: serde_json::Value,
}
impl EventEnvelope {
pub fn message(event: MessageEvent) -> Self {
Self {
event_id: event.event_id.clone(),
event_type: EventType::Message,
session_id: event.session_id.clone(),
project_hash: event.project_hash.clone(),
timestamp_ms: event.timestamp_ms,
sequence: event.sequence,
payload: serde_json::to_value(&event).unwrap(),
}
}
pub fn tool_call(event: ToolCallEvent) -> Self {
Self {
event_id: event.event_id.clone(),
event_type: EventType::ToolCall,
session_id: event.session_id.clone(),
project_hash: event.project_hash.clone(),
timestamp_ms: event.timestamp_ms,
sequence: event.sequence,
payload: serde_json::to_value(&event).unwrap(),
}
}
pub fn tool_result(event: ToolResultEvent) -> Self {
Self {
event_id: event.event_id.clone(),
event_type: EventType::ToolResult,
session_id: event.session_id.clone(),
project_hash: event.project_hash.clone(),
timestamp_ms: event.timestamp_ms,
sequence: event.sequence,
payload: serde_json::to_value(&event).unwrap(),
}
}
pub fn as_message_event(&self) -> Option<MessageEvent> {
if self.event_type == EventType::Message {
serde_json::from_value(self.payload.clone()).ok()
} else {
None
}
}
pub fn as_tool_call_event(&self) -> Option<ToolCallEvent> {
if self.event_type == EventType::ToolCall {
serde_json::from_value(self.payload.clone()).ok()
} else {
None
}
}
pub fn as_tool_result_event(&self) -> Option<ToolResultEvent> {
if self.event_type == EventType::ToolResult {
serde_json::from_value(self.payload.clone()).ok()
} else {
None
}
}
pub fn to_json_line(&self) -> String {
serde_json::to_string(self).unwrap()
}
pub fn from_json_line(line: &str) -> Result<Self, serde_json::Error> {
serde_json::from_str(line)
}
}