use serde::Serialize;
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum CompletionType {
StrReplaceSingle,
StrReplaceMulti,
WriteFileSingle,
ToolUseSingle,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum UnaryEvent {
Accept,
Reject,
Response,
}
pub struct UnaryEventMetadata {
pub language_name: String,
pub message_id: String,
pub platform: String,
pub has_feedback: Option<bool>,
}
pub struct LogEvent {
pub completion_type: CompletionType,
pub event: UnaryEvent,
pub metadata: UnaryEventMetadata,
}
pub async fn log_unary_event(event: LogEvent) {
let event_str = match event.event {
UnaryEvent::Accept => "accept",
UnaryEvent::Reject => "reject",
UnaryEvent::Response => "response",
};
let completion_type_str = match event.completion_type {
CompletionType::StrReplaceSingle => "str_replace_single",
CompletionType::StrReplaceMulti => "str_replace_multi",
CompletionType::WriteFileSingle => "write_file_single",
CompletionType::ToolUseSingle => "tool_use_single",
};
tracing::info!(
event = event_str,
completion_type = completion_type_str,
language_name = %event.metadata.language_name,
message_id = %event.metadata.message_id,
platform = %event.metadata.platform,
has_feedback = ?event.metadata.has_feedback,
"tengu_unary_event"
);
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_log_unary_event() {
let event = LogEvent {
completion_type: CompletionType::StrReplaceSingle,
event: UnaryEvent::Accept,
metadata: UnaryEventMetadata {
language_name: "rust".to_string(),
message_id: "msg-123".to_string(),
platform: "linux".to_string(),
has_feedback: Some(true),
},
};
log_unary_event(event).await;
}
}