use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TermSize {
pub cols: u16,
pub rows: u16,
}
impl Default for TermSize {
fn default() -> Self {
Self {
cols: 120,
rows: 40,
}
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum Request {
Run {
command: String,
args: Vec<String>,
name: Option<String>,
size: TermSize,
scrollback: usize,
env: Vec<(String, String)>,
cwd: Option<String>,
term: String,
shell: bool,
},
Kill {
name: String,
},
List,
Status {
name: String,
},
Screenshot {
name: String,
},
ScreenshotAnsi {
name: String,
},
ScreenshotCells {
name: String,
},
Cursor {
name: String,
},
Scrollback {
name: String,
lines: Option<usize>,
},
Type {
name: String,
text: String,
},
Press {
name: String,
keys: Vec<u8>,
},
Paste {
name: String,
text: String,
},
Resize {
name: String,
size: TermSize,
},
Mouse {
name: String,
action: MouseAction,
force: bool,
},
MouseState {
name: String,
},
Wait {
name: String,
stable_ms: Option<u64>,
text_pattern: Option<String>,
timeout_ms: u64,
},
Shutdown,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum MouseButton {
Left,
Right,
Middle,
}
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
pub struct MouseMods {
pub shift: bool,
pub alt: bool,
pub ctrl: bool,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum ScrollDir {
Up,
Down,
Left,
Right,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(tag = "kind")]
pub enum MouseTarget {
Coords { col: u16, row: u16 },
Text { needle: String, match_index: usize },
Regex { pattern: String, match_index: usize },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "kind")]
pub enum MouseAction {
Click {
target: MouseTarget,
button: MouseButton,
mods: MouseMods,
clicks: u32,
},
Down {
target: MouseTarget,
button: MouseButton,
mods: MouseMods,
},
Up {
target: MouseTarget,
button: MouseButton,
mods: MouseMods,
},
Move {
target: MouseTarget,
mods: MouseMods,
},
Drag {
from: MouseTarget,
to: MouseTarget,
button: MouseButton,
mods: MouseMods,
},
Scroll {
target: Option<MouseTarget>,
dir: ScrollDir,
amount: u32,
mods: MouseMods,
},
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum MouseMode {
None,
PressRelease,
ButtonMotion,
AnyMotion,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum MouseEncoding {
Default,
Utf8,
Sgr,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SessionInfo {
pub name: String,
pub pid: u32,
pub alive: bool,
pub exit_code: Option<i32>,
pub size: TermSize,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub struct CursorPos {
pub row: u16,
pub col: u16,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum Response {
Ok,
SessionCreated {
name: String,
pid: u32,
},
SessionList {
sessions: Vec<SessionInfo>,
},
Status {
#[serde(flatten)]
info: SessionInfo,
},
Screenshot {
content: String,
rows: u16,
cols: u16,
cursor: CursorPos,
mouse_cursor: Option<CursorPos>,
mouse_held: bool,
},
Cursor {
#[serde(flatten)]
pos: CursorPos,
},
ScreenshotAnsi {
content_b64: String,
rows: u16,
cols: u16,
mouse_cursor: Option<CursorPos>,
mouse_held: bool,
},
ScreenshotCells {
rows_ansi: Vec<String>,
rows: u16,
cols: u16,
mouse_cursor: Option<CursorPos>,
mouse_held: bool,
},
Scrollback {
content: String,
},
MouseState {
mode: MouseMode,
encoding: MouseEncoding,
size: TermSize,
cursor: Option<CursorPos>,
buttons_held: Vec<MouseButton>,
last_event: Option<MouseLastEvent>,
},
Error {
message: String,
},
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum MouseEventKind {
Down,
Up,
Move,
DragMove,
Scroll,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct MouseLastEvent {
pub kind: MouseEventKind,
pub col: u16,
pub row: u16,
pub button: Option<MouseButton>,
pub scroll_dir: Option<ScrollDir>,
pub mods: MouseMods,
pub ts_unix: u64,
}