tastty-core 0.1.0

Sans-IO core of the tastty terminal session library: VT parser, screen buffer, and byte encoders.
use super::super::{Screen, ScreenEvent, SemanticPrompt};

pub(in crate::screen) fn handle(screen: &mut Screen, params: &[&[u8]]) {
    // Each kind marks the cursor's current row, most-recent-wins.
    // Unknown kinds and non-numeric exit codes are dropped silently.
    let Some(kind) = params.get(1) else { return };
    let mark = match *kind {
        b"A" => SemanticPrompt::PromptStart,
        b"B" => SemanticPrompt::PromptEnd,
        b"C" => SemanticPrompt::OutputStart,
        b"D" => {
            let exit_code = match params.get(2) {
                None => None,
                Some(raw) => {
                    let Ok(s) = std::str::from_utf8(raw) else {
                        return;
                    };
                    let Ok(code) = s.parse::<i32>() else {
                        return;
                    };
                    Some(code)
                }
            };
            SemanticPrompt::OutputEnd { exit_code }
        }
        _ => return,
    };
    let row = screen.grid().pos().row;
    if let Some(row) = screen.grid_mut().drawing_row_mut(row) {
        row.set_semantic_prompt(mark);
    }
    screen
        .pending_events
        .push(ScreenEvent::ShellIntegration { mark });
}