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