1use super::{CommandTargetMetadata, CommandTargetSpec, TargetFindFlags, TargetFindType};
2
3#[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}