Skip to main content

wrightty_protocol/
methods.rs

1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4use crate::types::*;
5
6// --- Wrightty domain ---
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct GetInfoResult {
10    #[serde(flatten)]
11    pub info: ServerInfo,
12}
13
14// --- Authentication ---
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct AuthenticateParams {
18    pub password: String,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct AuthenticateResult {
23    pub authenticated: bool,
24}
25
26// --- Session domain ---
27
28#[derive(Debug, Clone, Serialize, Deserialize)]
29#[serde(rename_all = "camelCase")]
30pub struct SessionCreateParams {
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub shell: Option<String>,
33    #[serde(default, skip_serializing_if = "Vec::is_empty")]
34    pub args: Vec<String>,
35    #[serde(default = "default_cols")]
36    pub cols: u16,
37    #[serde(default = "default_rows")]
38    pub rows: u16,
39    #[serde(default, skip_serializing_if = "HashMap::is_empty")]
40    pub env: HashMap<String, String>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub cwd: Option<String>,
43}
44
45fn default_cols() -> u16 {
46    80
47}
48fn default_rows() -> u16 {
49    24
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize)]
53#[serde(rename_all = "camelCase")]
54pub struct SessionCreateResult {
55    pub session_id: SessionId,
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
59#[serde(rename_all = "camelCase")]
60pub struct SessionDestroyParams {
61    pub session_id: SessionId,
62    #[serde(skip_serializing_if = "Option::is_none")]
63    pub signal: Option<String>,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
67#[serde(rename_all = "camelCase")]
68pub struct SessionDestroyResult {
69    pub exit_code: Option<i32>,
70}
71
72#[derive(Debug, Clone, Serialize, Deserialize)]
73#[serde(rename_all = "camelCase")]
74pub struct SessionListResult {
75    pub sessions: Vec<SessionInfo>,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
79#[serde(rename_all = "camelCase")]
80pub struct SessionGetInfoParams {
81    pub session_id: SessionId,
82}
83
84// --- Input domain ---
85
86#[derive(Debug, Clone, Serialize, Deserialize)]
87#[serde(rename_all = "camelCase")]
88pub struct InputSendKeysParams {
89    pub session_id: SessionId,
90    pub keys: Vec<KeyInput>,
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
94#[serde(rename_all = "camelCase")]
95pub struct InputSendTextParams {
96    pub session_id: SessionId,
97    pub text: String,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
101#[serde(rename_all = "camelCase")]
102pub struct InputSendMouseParams {
103    pub session_id: SessionId,
104    pub event: String,
105    pub button: String,
106    pub row: u32,
107    pub col: u32,
108    #[serde(default, skip_serializing_if = "Vec::is_empty")]
109    pub modifiers: Vec<Modifier>,
110}
111
112// --- Screen domain ---
113
114#[derive(Debug, Clone, Serialize, Deserialize)]
115#[serde(rename_all = "camelCase")]
116pub struct ScreenGetContentsParams {
117    pub session_id: SessionId,
118    #[serde(skip_serializing_if = "Option::is_none")]
119    pub region: Option<ScreenRegion>,
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize)]
123#[serde(rename_all = "camelCase")]
124pub struct ScreenGetContentsResult {
125    pub rows: u32,
126    pub cols: u32,
127    pub cursor: CursorState,
128    pub cells: Vec<Vec<CellData>>,
129    pub alternate_screen: bool,
130}
131
132#[derive(Debug, Clone, Serialize, Deserialize)]
133#[serde(rename_all = "camelCase")]
134pub struct ScreenGetTextParams {
135    pub session_id: SessionId,
136    #[serde(skip_serializing_if = "Option::is_none")]
137    pub region: Option<ScreenRegion>,
138    #[serde(default = "default_true")]
139    pub trim_trailing_whitespace: bool,
140}
141
142fn default_true() -> bool {
143    true
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize)]
147pub struct ScreenGetTextResult {
148    pub text: String,
149}
150
151#[derive(Debug, Clone, Serialize, Deserialize)]
152#[serde(rename_all = "camelCase")]
153pub struct ScreenGetScrollbackParams {
154    pub session_id: SessionId,
155    #[serde(default = "default_scrollback_lines")]
156    pub lines: u32,
157    #[serde(default)]
158    pub offset: u32,
159}
160
161fn default_scrollback_lines() -> u32 {
162    100
163}
164
165#[derive(Debug, Clone, Serialize, Deserialize)]
166#[serde(rename_all = "camelCase")]
167pub struct ScrollbackLine {
168    pub text: String,
169    pub line_number: i32,
170}
171
172#[derive(Debug, Clone, Serialize, Deserialize)]
173#[serde(rename_all = "camelCase")]
174pub struct ScreenGetScrollbackResult {
175    pub lines: Vec<ScrollbackLine>,
176    pub total_scrollback: u32,
177}
178
179#[derive(Debug, Clone, Serialize, Deserialize)]
180#[serde(rename_all = "camelCase")]
181pub struct ScreenScreenshotParams {
182    pub session_id: SessionId,
183    pub format: ScreenshotFormat,
184    #[serde(skip_serializing_if = "Option::is_none")]
185    pub theme: Option<serde_json::Value>,
186    #[serde(skip_serializing_if = "Option::is_none")]
187    pub font: Option<FontConfig>,
188}
189
190#[derive(Debug, Clone, Serialize, Deserialize)]
191pub struct FontConfig {
192    pub family: String,
193    pub size: u32,
194}
195
196#[derive(Debug, Clone, Serialize, Deserialize)]
197#[serde(rename_all = "camelCase")]
198pub struct ScreenScreenshotResult {
199    pub format: ScreenshotFormat,
200    pub data: String,
201    #[serde(skip_serializing_if = "Option::is_none")]
202    pub width: Option<u32>,
203    #[serde(skip_serializing_if = "Option::is_none")]
204    pub height: Option<u32>,
205}
206
207#[derive(Debug, Clone, Serialize, Deserialize)]
208#[serde(rename_all = "camelCase")]
209pub struct ScreenWaitForTextParams {
210    pub session_id: SessionId,
211    pub pattern: String,
212    #[serde(default)]
213    pub is_regex: bool,
214    #[serde(skip_serializing_if = "Option::is_none")]
215    pub region: Option<ScreenRegion>,
216    #[serde(default = "default_timeout")]
217    pub timeout: u64,
218    #[serde(default = "default_interval")]
219    pub interval: u64,
220}
221
222fn default_timeout() -> u64 {
223    30000
224}
225fn default_interval() -> u64 {
226    100
227}
228
229#[derive(Debug, Clone, Serialize, Deserialize)]
230#[serde(rename_all = "camelCase")]
231pub struct TextMatch {
232    pub text: String,
233    pub row: u32,
234    pub col: u32,
235    pub length: u32,
236}
237
238#[derive(Debug, Clone, Serialize, Deserialize)]
239#[serde(rename_all = "camelCase")]
240pub struct ScreenWaitForTextResult {
241    pub found: bool,
242    pub matches: Vec<TextMatch>,
243    pub elapsed: u64,
244}
245
246#[derive(Debug, Clone, Serialize, Deserialize)]
247#[serde(rename_all = "camelCase")]
248pub struct ScreenWaitForCursorParams {
249    pub session_id: SessionId,
250    #[serde(skip_serializing_if = "Option::is_none")]
251    pub row: Option<u32>,
252    #[serde(skip_serializing_if = "Option::is_none")]
253    pub col: Option<u32>,
254    #[serde(default = "default_timeout")]
255    pub timeout: u64,
256}
257
258#[derive(Debug, Clone, Serialize, Deserialize)]
259#[serde(rename_all = "camelCase")]
260pub struct ScreenWaitForCursorResult {
261    pub cursor: CursorState,
262    pub elapsed: u64,
263}
264
265// --- Terminal domain ---
266
267#[derive(Debug, Clone, Serialize, Deserialize)]
268#[serde(rename_all = "camelCase")]
269pub struct TerminalResizeParams {
270    pub session_id: SessionId,
271    pub cols: u16,
272    pub rows: u16,
273}
274
275#[derive(Debug, Clone, Serialize, Deserialize)]
276#[serde(rename_all = "camelCase")]
277pub struct TerminalGetSizeParams {
278    pub session_id: SessionId,
279}
280
281#[derive(Debug, Clone, Serialize, Deserialize)]
282pub struct TerminalGetSizeResult {
283    pub cols: u16,
284    pub rows: u16,
285}
286
287#[derive(Debug, Clone, Serialize, Deserialize)]
288#[serde(rename_all = "camelCase")]
289pub struct TerminalSetColorPaletteParams {
290    pub session_id: SessionId,
291    pub palette: ColorPalette,
292}
293
294#[derive(Debug, Clone, Serialize, Deserialize)]
295#[serde(rename_all = "camelCase")]
296pub struct TerminalGetModesParams {
297    pub session_id: SessionId,
298}
299
300// --- Events domain ---
301
302#[derive(Debug, Clone, Serialize, Deserialize)]
303#[serde(rename_all = "camelCase")]
304pub struct EventsSubscribeParams {
305    pub session_id: SessionId,
306    pub events: Vec<String>,
307    #[serde(skip_serializing_if = "Option::is_none")]
308    pub options: Option<EventsSubscribeOptions>,
309}
310
311#[derive(Debug, Clone, Serialize, Deserialize)]
312#[serde(rename_all = "camelCase")]
313pub struct EventsSubscribeOptions {
314    #[serde(default = "default_debounce")]
315    pub screen_debounce_ms: u64,
316}
317
318fn default_debounce() -> u64 {
319    16
320}
321
322#[derive(Debug, Clone, Serialize, Deserialize)]
323#[serde(rename_all = "camelCase")]
324pub struct EventsSubscribeResult {
325    pub subscription_id: String,
326    pub subscribed_events: Vec<String>,
327}
328
329#[derive(Debug, Clone, Serialize, Deserialize)]
330#[serde(rename_all = "camelCase")]
331pub struct EventsUnsubscribeParams {
332    pub subscription_id: String,
333}