use zellij_utils::errors::{prelude::*, ContextType, PtyWriteContext}; use crate::thread_bus::Bus; #[derive(Debug, Clone, Eq, PartialEq)] pub enum PtyWriteInstruction { Write(Vec, u32), Exit, } impl From<&PtyWriteInstruction> for PtyWriteContext { fn from(tty_write_instruction: &PtyWriteInstruction) -> Self { match *tty_write_instruction { PtyWriteInstruction::Write(..) => PtyWriteContext::Write, PtyWriteInstruction::Exit => PtyWriteContext::Exit, } } } pub(crate) fn pty_writer_main(bus: Bus) -> Result<()> { let err_context = || "failed to write to pty".to_string(); loop { let (event, mut err_ctx) = bus.recv().with_context(err_context)?; err_ctx.add_call(ContextType::PtyWrite((&event).into())); let os_input = bus .os_input .clone() .context("no OS input API found") .with_context(err_context)?; match event { PtyWriteInstruction::Write(bytes, terminal_id) => { os_input .write_to_tty_stdin(terminal_id, &bytes) .with_context(err_context) .non_fatal(); os_input .tcdrain(terminal_id) .with_context(err_context) .non_fatal(); }, PtyWriteInstruction::Exit => { return Ok(()); }, } } }