use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::{
harness::Harness,
hook::{Event, ToolCall},
};
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
#[non_exhaustive]
pub struct HookInput {
pub harness: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub event: Option<Event>,
#[serde(skip_serializing_if = "Option::is_none")]
pub session_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cwd: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transcript_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool: Option<ToolCall>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_output: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<String>,
#[serde(skip_serializing_if = "std::ops::Not::not")]
pub continuing: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_message: Option<String>,
#[serde(skip_serializing_if = "Value::is_null")]
pub raw: Value,
}
impl HookInput {
pub fn parse(harness: &dyn Harness, event: Event, text: &str) -> serde_json::Result<Self> {
harness.parse_hook(event, text)
}
pub fn new(harness: impl Into<String>, event: Event, raw: Value) -> Self {
HookInput {
harness: harness.into(),
event: Some(event),
raw,
..HookInput::default()
}
}
}