Skip to main content

ratatui_toolkit/vt100_term/
parser.rs

1//! VT100 parser integration with termwiz
2
3use super::Screen;
4use std::sync::{Arc, Mutex};
5use termwiz::escape::parser::Parser as TermwizParser;
6
7/// VT100 parser
8///
9/// Wraps termwiz's parser and feeds actions to our custom Screen
10pub struct Parser {
11    /// termwiz parser (only used for parsing, not state)
12    parser: Arc<Mutex<TermwizParser>>,
13
14    /// Our custom screen state
15    screen: Screen,
16}
17
18impl Parser {
19    /// Create a new parser
20    pub fn new(rows: usize, cols: usize, scrollback_len: usize) -> Self {
21        Self {
22            parser: Arc::new(Mutex::new(TermwizParser::new())),
23            screen: Screen::new(rows, cols, scrollback_len),
24        }
25    }
26
27    /// Get the screen
28    pub fn screen(&self) -> &Screen {
29        &self.screen
30    }
31
32    /// Get mutable screen
33    pub fn screen_mut(&mut self) -> &mut Screen {
34        &mut self.screen
35    }
36
37    /// Process raw bytes from PTY
38    pub fn process(&mut self, bytes: &[u8]) {
39        let mut parser = self.parser.lock().unwrap();
40
41        parser.parse(bytes, |action| {
42            self.screen.handle_action(&action);
43        });
44    }
45
46    /// Resize the terminal
47    pub fn resize(&mut self, rows: usize, cols: usize) {
48        self.screen.resize(rows, cols);
49    }
50}