use std::fmt;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum HookName {
ClientAttached,
ClientDetached,
ClientSessionChanged,
SessionCreated,
SessionClosed,
SessionRenamed,
SessionWindowChanged,
WindowLinked,
WindowUnlinked,
WindowRenamed,
WindowLayoutChanged,
WindowPaneChanged,
PaneExited,
PaneModeChanged,
PasteBufferChanged,
PasteBufferDeleted,
AfterSelectWindow,
AfterSelectPane,
AfterSendKeys,
AfterSetOption,
AfterBindKey,
AfterCapturePane,
AfterCopyMode,
AfterDisplayMessage,
AfterDisplayPanes,
AfterKillPane,
AfterListBuffers,
AfterListClients,
AfterListKeys,
AfterListPanes,
AfterListSessions,
AfterListWindows,
AfterLoadBuffer,
AfterLockServer,
AfterNewSession,
AfterNewWindow,
AfterPasteBuffer,
AfterPipePane,
AfterQueue,
AfterRefreshClient,
AfterRenameSession,
AfterRenameWindow,
AfterResizePane,
AfterResizeWindow,
AfterSaveBuffer,
AfterSelectLayout,
AfterSetBuffer,
AfterSetEnvironment,
AfterSetHook,
AfterShowEnvironment,
AfterShowMessages,
AfterShowOptions,
AfterSplitWindow,
AfterUnbindKey,
AlertActivity,
AlertBell,
AlertSilence,
ClientActive,
ClientFocusIn,
ClientFocusOut,
ClientResized,
ClientLightTheme,
ClientDarkTheme,
CommandError,
PaneDied,
PaneFocusIn,
PaneFocusOut,
PaneSetClipboard,
PaneTitleChanged,
WindowResized,
}
impl HookName {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::ClientAttached => "client-attached",
Self::ClientDetached => "client-detached",
Self::ClientSessionChanged => "client-session-changed",
Self::SessionCreated => "session-created",
Self::SessionClosed => "session-closed",
Self::SessionRenamed => "session-renamed",
Self::SessionWindowChanged => "session-window-changed",
Self::WindowLinked => "window-linked",
Self::WindowUnlinked => "window-unlinked",
Self::WindowRenamed => "window-renamed",
Self::WindowLayoutChanged => "window-layout-changed",
Self::WindowPaneChanged => "window-pane-changed",
Self::PaneExited => "pane-exited",
Self::PaneModeChanged => "pane-mode-changed",
Self::PasteBufferChanged => "paste-buffer-changed",
Self::PasteBufferDeleted => "paste-buffer-deleted",
Self::AfterSelectWindow => "after-select-window",
Self::AfterSelectPane => "after-select-pane",
Self::AfterSendKeys => "after-send-keys",
Self::AfterSetOption => "after-set-option",
Self::AfterBindKey => "after-bind-key",
Self::AfterCapturePane => "after-capture-pane",
Self::AfterCopyMode => "after-copy-mode",
Self::AfterDisplayMessage => "after-display-message",
Self::AfterDisplayPanes => "after-display-panes",
Self::AfterKillPane => "after-kill-pane",
Self::AfterListBuffers => "after-list-buffers",
Self::AfterListClients => "after-list-clients",
Self::AfterListKeys => "after-list-keys",
Self::AfterListPanes => "after-list-panes",
Self::AfterListSessions => "after-list-sessions",
Self::AfterListWindows => "after-list-windows",
Self::AfterLoadBuffer => "after-load-buffer",
Self::AfterLockServer => "after-lock-server",
Self::AfterNewSession => "after-new-session",
Self::AfterNewWindow => "after-new-window",
Self::AfterPasteBuffer => "after-paste-buffer",
Self::AfterPipePane => "after-pipe-pane",
Self::AfterQueue => "after-queue",
Self::AfterRefreshClient => "after-refresh-client",
Self::AfterRenameSession => "after-rename-session",
Self::AfterRenameWindow => "after-rename-window",
Self::AfterResizePane => "after-resize-pane",
Self::AfterResizeWindow => "after-resize-window",
Self::AfterSaveBuffer => "after-save-buffer",
Self::AfterSelectLayout => "after-select-layout",
Self::AfterSetBuffer => "after-set-buffer",
Self::AfterSetEnvironment => "after-set-environment",
Self::AfterSetHook => "after-set-hook",
Self::AfterShowEnvironment => "after-show-environment",
Self::AfterShowMessages => "after-show-messages",
Self::AfterShowOptions => "after-show-options",
Self::AfterSplitWindow => "after-split-window",
Self::AfterUnbindKey => "after-unbind-key",
Self::AlertActivity => "alert-activity",
Self::AlertBell => "alert-bell",
Self::AlertSilence => "alert-silence",
Self::ClientActive => "client-active",
Self::ClientFocusIn => "client-focus-in",
Self::ClientFocusOut => "client-focus-out",
Self::ClientResized => "client-resized",
Self::ClientLightTheme => "client-light-theme",
Self::ClientDarkTheme => "client-dark-theme",
Self::CommandError => "command-error",
Self::PaneDied => "pane-died",
Self::PaneFocusIn => "pane-focus-in",
Self::PaneFocusOut => "pane-focus-out",
Self::PaneSetClipboard => "pane-set-clipboard",
Self::PaneTitleChanged => "pane-title-changed",
Self::WindowResized => "window-resized",
}
}
#[must_use]
#[allow(clippy::should_implement_trait)]
pub fn from_str(value: &str) -> Option<Self> {
Some(match value {
"client-attached" => Self::ClientAttached,
"client-detached" => Self::ClientDetached,
"client-session-changed" => Self::ClientSessionChanged,
"session-created" => Self::SessionCreated,
"session-closed" => Self::SessionClosed,
"session-renamed" => Self::SessionRenamed,
"session-window-changed" => Self::SessionWindowChanged,
"window-linked" => Self::WindowLinked,
"window-unlinked" => Self::WindowUnlinked,
"window-renamed" => Self::WindowRenamed,
"window-layout-changed" => Self::WindowLayoutChanged,
"window-pane-changed" => Self::WindowPaneChanged,
"pane-exited" => Self::PaneExited,
"pane-mode-changed" => Self::PaneModeChanged,
"paste-buffer-changed" => Self::PasteBufferChanged,
"paste-buffer-deleted" => Self::PasteBufferDeleted,
"after-select-window" => Self::AfterSelectWindow,
"after-select-pane" => Self::AfterSelectPane,
"after-send-keys" => Self::AfterSendKeys,
"after-set-option" => Self::AfterSetOption,
"after-bind-key" => Self::AfterBindKey,
"after-capture-pane" => Self::AfterCapturePane,
"after-copy-mode" => Self::AfterCopyMode,
"after-display-message" => Self::AfterDisplayMessage,
"after-display-panes" => Self::AfterDisplayPanes,
"after-kill-pane" => Self::AfterKillPane,
"after-list-buffers" => Self::AfterListBuffers,
"after-list-clients" => Self::AfterListClients,
"after-list-keys" => Self::AfterListKeys,
"after-list-panes" => Self::AfterListPanes,
"after-list-sessions" => Self::AfterListSessions,
"after-list-windows" => Self::AfterListWindows,
"after-load-buffer" => Self::AfterLoadBuffer,
"after-lock-server" => Self::AfterLockServer,
"after-new-session" => Self::AfterNewSession,
"after-new-window" => Self::AfterNewWindow,
"after-paste-buffer" => Self::AfterPasteBuffer,
"after-pipe-pane" => Self::AfterPipePane,
"after-queue" => Self::AfterQueue,
"after-refresh-client" => Self::AfterRefreshClient,
"after-rename-session" => Self::AfterRenameSession,
"after-rename-window" => Self::AfterRenameWindow,
"after-resize-pane" => Self::AfterResizePane,
"after-resize-window" => Self::AfterResizeWindow,
"after-save-buffer" => Self::AfterSaveBuffer,
"after-select-layout" => Self::AfterSelectLayout,
"after-set-buffer" => Self::AfterSetBuffer,
"after-set-environment" => Self::AfterSetEnvironment,
"after-set-hook" => Self::AfterSetHook,
"after-show-environment" => Self::AfterShowEnvironment,
"after-show-messages" => Self::AfterShowMessages,
"after-show-options" => Self::AfterShowOptions,
"after-split-window" => Self::AfterSplitWindow,
"after-unbind-key" => Self::AfterUnbindKey,
"alert-activity" => Self::AlertActivity,
"alert-bell" => Self::AlertBell,
"alert-silence" => Self::AlertSilence,
"client-active" => Self::ClientActive,
"client-focus-in" => Self::ClientFocusIn,
"client-focus-out" => Self::ClientFocusOut,
"client-resized" => Self::ClientResized,
"client-light-theme" => Self::ClientLightTheme,
"client-dark-theme" => Self::ClientDarkTheme,
"command-error" => Self::CommandError,
"pane-died" => Self::PaneDied,
"pane-focus-in" => Self::PaneFocusIn,
"pane-focus-out" => Self::PaneFocusOut,
"pane-set-clipboard" => Self::PaneSetClipboard,
"pane-title-changed" => Self::PaneTitleChanged,
"window-resized" => Self::WindowResized,
_ => return None,
})
}
#[must_use]
pub fn from_str_opt(value: &str) -> Option<Self> {
Self::from_str(value)
}
}
impl std::str::FromStr for HookName {
type Err = ();
fn from_str(value: &str) -> Result<Self, Self::Err> {
Self::from_str_opt(value).ok_or(())
}
}
impl fmt::Display for HookName {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.as_str())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum HookLifecycle {
Persistent,
OneShot,
}