Skip to main content

rmux_core/target_find/
metadata.rs

1use super::{CommandTargetMetadata, CommandTargetSpec, TargetFindFlags, TargetFindType};
2
3/// Returns command target metadata for commands currently routed through the parsed queue.
4#[must_use]
5pub fn command_target_metadata(command_name: &str) -> Option<CommandTargetMetadata> {
6    use TargetFindFlags as Flags;
7    use TargetFindType as Type;
8
9    match command_name {
10        "break-pane" => Some(metadata(
11            Some(spec('s', Type::Pane, Flags::NONE)),
12            Some(spec('t', Type::Window, Flags::WINDOW_INDEX)),
13        )),
14        "capture-pane" | "kill-pane" | "paste-buffer" | "pipe-pane" | "resize-pane"
15        | "respawn-pane" | "select-pane" | "send-keys" | "send-prefix" | "split-window" => {
16            Some(metadata(None, Some(spec('t', Type::Pane, Flags::NONE))))
17        }
18        "copy-mode" => Some(metadata(
19            Some(spec('s', Type::Pane, Flags::NONE)),
20            Some(spec('t', Type::Pane, Flags::NONE)),
21        )),
22        "display-menu" | "display-message" | "display-popup" | "if-shell" | "show-hooks"
23        | "show-options" | "run-shell" | "source-file" => {
24            Some(metadata(None, Some(spec('t', Type::Pane, Flags::CANFAIL))))
25        }
26        "join-pane" | "move-pane" | "swap-pane" => Some(metadata(
27            Some(spec('s', Type::Pane, Flags::DEFAULT_MARKED)),
28            Some(spec('t', Type::Pane, Flags::NONE)),
29        )),
30        "kill-window" | "last-pane" | "list-panes" | "next-layout" | "previous-layout"
31        | "rename-window" | "resize-window" | "respawn-window" | "rotate-window"
32        | "select-layout" | "select-window" | "unlink-window" => {
33            Some(metadata(None, Some(spec('t', Type::Window, Flags::NONE))))
34        }
35        "link-window" | "move-window" => Some(metadata(
36            Some(spec('s', Type::Window, Flags::NONE)),
37            Some(spec('t', Type::Window, Flags::WINDOW_INDEX)),
38        )),
39        "new-window" => Some(metadata(
40            None,
41            Some(spec('t', Type::Window, Flags::WINDOW_INDEX)),
42        )),
43        "swap-window" => Some(metadata(
44            Some(spec('s', Type::Window, Flags::DEFAULT_MARKED)),
45            Some(spec('t', Type::Window, Flags::NONE)),
46        )),
47        "attach-session" => Some(metadata(
48            None,
49            Some(spec('t', Type::Session, Flags::PREFER_UNATTACHED)),
50        )),
51        "display-panes" | "has-session" | "kill-session" | "last-window" | "list-windows"
52        | "next-window" | "previous-window" | "rename-session" => {
53            Some(metadata(None, Some(spec('t', Type::Session, Flags::NONE))))
54        }
55        "set-hook" => Some(metadata(None, Some(spec('t', Type::Pane, Flags::CANFAIL)))),
56        "set-environment" | "show-environment" => Some(metadata(
57            None,
58            Some(spec('t', Type::Session, Flags::CANFAIL)),
59        )),
60        "switch-client" => Some(metadata(None, Some(spec('t', Type::Window, Flags::NONE)))),
61        "set-option" => Some(metadata(
62            None,
63            Some(spec('t', Type::Session, Flags::CANFAIL)),
64        )),
65        "set-window-option" | "show-window-options" => Some(metadata(
66            None,
67            Some(spec('t', Type::Window, Flags::CANFAIL)),
68        )),
69        _ => None,
70    }
71}
72
73const fn metadata(
74    source: Option<CommandTargetSpec>,
75    target: Option<CommandTargetSpec>,
76) -> CommandTargetMetadata {
77    CommandTargetMetadata { source, target }
78}
79
80const fn spec(flag: char, find_type: TargetFindType, flags: TargetFindFlags) -> CommandTargetSpec {
81    CommandTargetSpec {
82        flag,
83        find_type,
84        flags,
85    }
86}