ghosttea-core 0.3.0

Platform-neutral terminal model contracts for Ghosttea
use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct LogicalTerminalSnapshot {
    pub session_epoch: u64,
    pub layout_epoch: u64,
    pub terminal_revision: u64,
    pub cols: u16,
    pub rows: Vec<LogicalRow>,
    pub cursor: LogicalCursor,
    pub mouse_tracking: bool,
    pub scrollbar: LogicalScrollbar,
    pub title: Option<String>,
    pub cwd: Option<String>,
}

#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct LogicalTerminalPatch {
    pub session_epoch: u64,
    pub layout_epoch: u64,
    pub patch_sequence: u64,
    pub terminal_revision: u64,
    pub row_replacements: Vec<RowReplacement>,
    pub cursor: Option<LogicalCursor>,
    pub mouse_tracking: Option<bool>,
    pub scrollbar: Option<LogicalScrollbar>,
}

#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct RowReplacement {
    pub row_index: u16,
    pub row_revision: u64,
    pub row: LogicalRow,
}

#[derive(Clone, Copy, Debug, Default, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct LogicalScrollbar {
    pub total: u64,
    pub offset: u64,
    pub len: u64,
}

#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct LogicalRow {
    pub text: String,
    pub cells: Vec<LogicalCell>,
}

#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct LogicalCell {
    pub column: u16,
    pub span: u16,
    pub text: String,
    pub style: LogicalCellStyle,
}

#[derive(Clone, Copy, Debug, Default, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct LogicalCellStyle {
    pub bold: bool,
    pub italic: bool,
    pub faint: bool,
    pub inverse: bool,
    pub invisible: bool,
    pub strikethrough: bool,
    pub underline: bool,
    pub foreground: Option<[u8; 3]>,
    pub background: Option<[u8; 3]>,
}

#[derive(Clone, Copy, Debug, Default, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct LogicalCursor {
    pub x: u16,
    pub y: u16,
    pub visible: bool,
    pub style: u8,
    pub blinking: bool,
}

#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct AccessibilityRow {
    pub row: u16,
    pub text: String,
}