1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
//! Resolved arguments and invocation requests.
//!
//! Use this module at the dispatch boundary:
//!
//! - [`ActionArgs`] stores resolved input values keyed by [`InputId`].
//! - [`ActionInvocation`] names the action, carries resolved arguments, and records source.
//! - [`InvocationSource`] identifies the UI or integration that requested the action.
use BTreeMap;
use crate;
/// Resolved arguments for an action invocation.
///
/// Arguments are keyed by [`InputId`] so dispatch code can read values without
/// knowing which UI surface collected them.
///
/// Method groups:
///
/// - **Construction and mutation:** [`new`](Self::new) and [`insert`](Self::insert).
/// - **Inspection:** [`get`](Self::get), [`iter`](Self::iter), and [`is_empty`](Self::is_empty).
///
/// # Examples
///
/// ```
/// use ratatui_action::id::InputId;
/// use ratatui_action::invocation::ActionArgs;
///
/// let mut args = ActionArgs::new();
/// args.insert("theme", "github-dark");
///
/// assert_eq!(args.get(&InputId::new("theme")), Some("github-dark"));
/// assert!(!args.is_empty());
/// ```
/// A request for the application to run an action.
///
/// Invocation is the handoff point between a UI surface and application-owned
/// dispatch. The action crate does not execute callbacks or mutate application
/// state.
///
/// Use [`new`](Self::new) for actions without arguments and [`with_args`](Self::with_args) when a
/// UI surface has collected inputs. Dispatch code usually reads [`id`](Self::id),
/// [`args`](Self::args), and [`source`](Self::source).
///
/// # Examples
///
/// ```
/// use ratatui_action::id::InputId;
/// use ratatui_action::invocation::{ActionArgs, ActionInvocation, InvocationSource};
///
/// let mut args = ActionArgs::new();
/// args.insert(InputId::new("theme"), "github-dark");
///
/// let invocation = ActionInvocation::with_args("theme.switch", args, InvocationSource::Palette);
///
/// assert_eq!(invocation.id().as_str(), "theme.switch");
/// assert_eq!(invocation.source(), InvocationSource::Palette);
/// ```
/// UI or integration surface that requested an action invocation.
///
/// The source lets dispatch code distinguish user intent from a palette,
/// keybinding, menu, mouse action, or automation path when that distinction
/// affects behavior or telemetry.
///
/// Match this enum when dispatch needs different policy for palette, keybinding,
/// menu, mouse, or automation callers.