use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", content = "payload")]
pub enum TerminalMessage {
Input(TerminalInput),
Output(TerminalOutput),
Control(ControlMessage),
Status(StatusMessage),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", content = "data")]
pub enum TerminalInput {
Text(String),
Binary(Vec<u8>),
SpecialKey(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TerminalOutput {
pub data: String,
pub timestamp: chrono::DateTime<chrono::Utc>,
pub sequence: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "command", content = "params")]
pub enum ControlMessage {
Resize { rows: u16, cols: u16 },
ModeChange { mode: String },
Focus,
Blur,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "status")]
pub enum StatusMessage {
Ready {
terminal_id: String,
rows: u16,
cols: u16,
},
Exited {
terminal_id: String,
exit_code: Option<i32>,
},
Error { terminal_id: String, error: String },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateTerminalOptions {
pub id: String,
pub shell: Option<String>,
pub rows: u16,
pub cols: u16,
pub cwd: Option<String>,
pub env: Option<std::collections::HashMap<String, String>>,
pub command: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchInput {
pub terminal_id: String,
pub inputs: Vec<TerminalInput>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TerminalMetadata {
pub id: String,
pub title: String,
pub shell: String,
pub rows: u16,
pub cols: u16,
pub created_at: chrono::DateTime<chrono::Utc>,
pub last_activity: chrono::DateTime<chrono::Utc>,
pub process_id: Option<u32>,
}
impl TerminalInput {
pub fn text(text: impl Into<String>) -> Self {
Self::Text(text.into())
}
pub fn key(key: impl Into<String>) -> Self {
Self::SpecialKey(key.into())
}
pub fn paste(text: impl Into<String>) -> Self {
let text = text.into();
Self::Binary(text.as_bytes().to_vec())
}
}