use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EventMetadata {
pub uuid: String,
#[serde(rename = "parentUuid")]
pub parent_uuid: Option<String>,
#[serde(rename = "sessionId")]
pub session_id: String,
pub timestamp: DateTime<Utc>,
#[serde(rename = "isSidechain")]
pub is_sidechain: bool,
#[serde(rename = "userType")]
pub user_type: Option<String>,
pub cwd: Option<String>,
pub version: Option<String>,
#[serde(rename = "gitBranch")]
pub git_branch: Option<String>,
pub slug: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogicalParentMetadata {
#[serde(rename = "logicalParentUuid")]
pub logical_parent_uuid: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolUseMetadata {
#[serde(rename = "toolUseID")]
pub tool_use_id: Option<String>,
#[serde(rename = "parentToolUseID")]
pub parent_tool_use_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SourceToolMetadata {
#[serde(rename = "sourceToolAssistantUUID")]
pub source_tool_assistant_uuid: Option<String>,
}
impl EventMetadata {
pub fn is_user_prompt(&self) -> bool {
self.user_type.as_deref() == Some("external")
}
pub fn is_internal(&self) -> bool {
self.user_type.as_deref() == Some("internal")
}
pub fn is_sidechain(&self) -> bool {
self.is_sidechain
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_metadata_user_type_checks() {
let metadata = EventMetadata {
uuid: "test-uuid".to_string(),
parent_uuid: None,
session_id: "session-123".to_string(),
timestamp: Utc::now(),
is_sidechain: false,
user_type: Some("external".to_string()),
cwd: Some("/test".to_string()),
version: Some("2.1.19".to_string()),
git_branch: Some("main".to_string()),
slug: None,
};
assert!(metadata.is_user_prompt());
assert!(!metadata.is_internal());
assert!(!metadata.is_sidechain());
}
#[test]
fn test_metadata_internal_type() {
let metadata = EventMetadata {
uuid: "test-uuid".to_string(),
parent_uuid: Some("parent-uuid".to_string()),
session_id: "session-123".to_string(),
timestamp: Utc::now(),
is_sidechain: false,
user_type: Some("internal".to_string()),
cwd: Some("/test".to_string()),
version: Some("2.1.19".to_string()),
git_branch: Some("main".to_string()),
slug: None,
};
assert!(!metadata.is_user_prompt());
assert!(metadata.is_internal());
}
#[test]
fn test_metadata_sidechain() {
let metadata = EventMetadata {
uuid: "test-uuid".to_string(),
parent_uuid: Some("parent-uuid".to_string()),
session_id: "session-123".to_string(),
timestamp: Utc::now(),
is_sidechain: true,
user_type: Some("external".to_string()),
cwd: Some("/test".to_string()),
version: Some("2.1.19".to_string()),
git_branch: Some("main".to_string()),
slug: None,
};
assert!(metadata.is_sidechain());
}
}