use serde::{Deserialize, Serialize};
use tatara_lisp::DeriveTataraDomain;
#[derive(DeriveTataraDomain, Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
#[tatara(keyword = "defhook")]
pub struct HookSpec {
pub event: String,
pub command: String,
#[serde(default)]
pub from: String,
#[serde(default)]
pub to: String,
#[serde(default)]
pub pattern: String,
}
pub const KNOWN_EVENTS: &[&str] = &[
"BufAdd",
"BufDelete",
"BufEnter",
"BufFilePre",
"BufFilePost",
"BufHidden",
"BufLeave",
"BufModifiedSet",
"BufNew",
"BufNewFile",
"BufReadCmd",
"BufReadPost",
"BufReadPre",
"BufUnload",
"BufWinEnter",
"BufWinLeave",
"BufWipeout",
"BufWriteCmd",
"BufWritePost",
"BufWritePre",
"CursorHold",
"CursorHoldI",
"CursorMoved",
"CursorMovedI",
"InsertChange",
"InsertCharPre",
"InsertEnter",
"InsertLeave",
"InsertLeavePre",
"ModeChanged",
"TextChanged",
"TextChangedI",
"TextYankPost",
"ColorScheme",
"ColorSchemePre",
"FocusGained",
"FocusLost",
"WinClosed",
"WinEnter",
"WinLeave",
"WinNew",
"WinResized",
"WinScrolled",
"TabEnter",
"TabLeave",
"TabClosed",
"TabNew",
"TabNewEntered",
"VimEnter",
"VimLeave",
"VimLeavePre",
"VimResized",
"VimResume",
"VimSuspend",
"DiagnosticChanged",
"LspAttach",
"LspDetach",
"LspNotify",
"LspProgress",
"LspRequest",
"LspTokenUpdate",
"FileAppendCmd",
"FileAppendPost",
"FileAppendPre",
"FileReadCmd",
"FileReadPost",
"FileReadPre",
"FileType",
"FileWriteCmd",
"FileWritePost",
"FileWritePre",
"QuickFixCmdPost",
"QuickFixCmdPre",
"ShellCmdPost",
"ShellFilterPost",
"SignalUSR1",
"TermClose",
"TermEnter",
"TermLeave",
"TermOpen",
"TermRequest",
"TermResponse",
"CmdlineChanged",
"CmdlineEnter",
"CmdlineLeave",
"CmdUndefined",
"CmdwinEnter",
"CmdwinLeave",
"CompleteChanged",
"CompleteDone",
"CompleteDonePre",
"MenuPopup",
"OptionSet",
"RecordingEnter",
"RecordingLeave",
"SearchWrapped",
"SessionLoadPost",
"SessionWritePost",
"Signal",
"SourceCmd",
"SourcePost",
"SourcePre",
"SpellFileMissing",
"StdinReadPost",
"StdinReadPre",
"SwapExists",
"Syntax",
"UIEnter",
"UILeave",
"User",
];
#[must_use]
pub fn is_known_event(name: &str) -> bool {
KNOWN_EVENTS.iter().any(|e| *e == name)
}