use std::io::Write;
pub struct TmuxWriter<W: Write> {
inner: W,
wrote_first: bool
}
impl<W: Write> TmuxWriter<W> {
pub fn new(inner: W) -> Self {
Self {
inner,
wrote_first: false
}
}
}
impl<W: Write> Write for TmuxWriter<W> {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
if !self.wrote_first {
self.inner.write_all(b"\x1bPtmux;")?;
self.wrote_first = true;
}
let mut last_idx_written = None;
while let Some(next_pos) = memchr::memchr(b'\x1b', buf) {
self.inner.write_all(&buf[..=next_pos])?;
self.inner.write_all(&[0x1b])?;
last_idx_written = Some(next_pos);
}
match last_idx_written {
Some(i) =>
if let Some(i) = i.checked_add(1) {
self.inner.write_all(&buf[i..])?;
},
None => self.inner.write_all(buf)?
}
if buf.last().is_some_and(|b| *b == b'\\') {
self.inner.write_all(b"\x1b\\")?;
self.wrote_first = false;
}
Ok(buf.len())
}
fn flush(&mut self) -> std::io::Result<()> {
self.inner.flush()
}
}