use std::fmt;
use std::str::FromStr;
use serde::{Deserialize, Serialize};
use crate::errors::ParseEnumError;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub enum HookEvent {
PreToolUse,
PostToolUse,
PostToolUseFailure,
SessionStart,
SessionEnd,
UserPromptSubmit,
Notification,
Stop,
SubagentStart,
SubagentStop,
}
impl HookEvent {
pub const ALL_VARIANTS: &'static [Self] = &[
Self::PreToolUse,
Self::PostToolUse,
Self::PostToolUseFailure,
Self::SessionStart,
Self::SessionEnd,
Self::UserPromptSubmit,
Self::Notification,
Self::Stop,
Self::SubagentStart,
Self::SubagentStop,
];
pub const fn as_str(&self) -> &'static str {
match self {
Self::PreToolUse => "PreToolUse",
Self::PostToolUse => "PostToolUse",
Self::PostToolUseFailure => "PostToolUseFailure",
Self::SessionStart => "SessionStart",
Self::SessionEnd => "SessionEnd",
Self::UserPromptSubmit => "UserPromptSubmit",
Self::Notification => "Notification",
Self::Stop => "Stop",
Self::SubagentStart => "SubagentStart",
Self::SubagentStop => "SubagentStop",
}
}
}
impl fmt::Display for HookEvent {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
impl FromStr for HookEvent {
type Err = ParseEnumError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"PreToolUse" => Ok(Self::PreToolUse),
"PostToolUse" => Ok(Self::PostToolUse),
"PostToolUseFailure" => Ok(Self::PostToolUseFailure),
"SessionStart" => Ok(Self::SessionStart),
"SessionEnd" => Ok(Self::SessionEnd),
"UserPromptSubmit" => Ok(Self::UserPromptSubmit),
"Notification" => Ok(Self::Notification),
"Stop" => Ok(Self::Stop),
"SubagentStart" => Ok(Self::SubagentStart),
"SubagentStop" => Ok(Self::SubagentStop),
_ => Err(ParseEnumError::new("hook_event", s)),
}
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum HookCategory {
System,
#[default]
Custom,
}
impl HookCategory {
pub const fn as_str(&self) -> &'static str {
match self {
Self::System => "system",
Self::Custom => "custom",
}
}
}
impl fmt::Display for HookCategory {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
impl FromStr for HookCategory {
type Err = ParseEnumError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"system" => Ok(Self::System),
"custom" => Ok(Self::Custom),
_ => Err(ParseEnumError::new("hook_category", s)),
}
}
}