use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Event {
HookDecision(HookDecision),
BufferRefresh(BufferRefresh),
NvimLaunch(NvimLaunch),
StatsView(StatsView),
}
impl Event {
pub fn timestamp(&self) -> DateTime<Utc> {
match self {
Event::HookDecision(e) => e.at,
Event::BufferRefresh(e) => e.at,
Event::NvimLaunch(e) => e.at,
Event::StatsView(e) => e.at,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ToolKind {
Edit,
Write,
MultiEdit,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Decision {
Allow,
Deny,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum DecisionReason {
NoNvimRunning,
StatusCheckFailed,
BufferDirtyAndCurrent,
BufferAvailable,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HookDecision {
pub at: DateTime<Utc>,
pub session_id: String,
pub cwd: String,
pub tool: ToolKind,
pub file: String,
pub decision: Decision,
pub reason: DecisionReason,
pub instances_probed: usize,
pub latency_ms: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BufferRefresh {
pub at: DateTime<Utc>,
pub session_id: String,
pub cwd: String,
pub tool: ToolKind,
pub file: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NvimLaunch {
pub at: DateTime<Utc>,
pub pid: u32,
pub cwd: String,
pub socket_path: String,
pub args: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StatsView {
pub at: DateTime<Utc>,
pub range: String,
}