1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4use crate::types::*;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct GetInfoResult {
10 #[serde(flatten)]
11 pub info: ServerInfo,
12}
13
14#[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#[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#[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#[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#[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}