use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ClientMessage {
Attach { cols: u16, rows: u16 },
Input(Vec<u8>),
Resize { cols: u16, rows: u16 },
Detach,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DaemonMessage {
Attached,
Output(Vec<u8>),
ReplayStart,
ReplayEnd,
ChildExited { code: Option<i32> },
Error(String),
}
pub fn encode_message<T: Serialize>(msg: &T) -> anyhow::Result<Vec<u8>> {
let payload = bincode::serde::encode_to_vec(msg, bincode::config::standard())?;
let len = payload.len() as u32;
let mut buf = len.to_be_bytes().to_vec();
buf.extend(payload);
Ok(buf)
}
pub fn decode_message<T: for<'de> Deserialize<'de>>(
buf: &[u8],
) -> anyhow::Result<Option<(T, usize)>> {
if buf.len() < 4 {
return Ok(None);
}
let len = u32::from_be_bytes([buf[0], buf[1], buf[2], buf[3]]) as usize;
let total = 4 + len;
if buf.len() < total {
return Ok(None);
}
let (msg, _): (T, usize) =
bincode::serde::decode_from_slice(&buf[4..total], bincode::config::standard())?;
Ok(Some((msg, total)))
}