ratatui_kit/terminal/
cross_terminal.rs1use super::TerminalImpl;
2use crossterm::event::{self, EventStream};
3use futures::{StreamExt, stream::BoxStream};
4use ratatui::{Frame, TerminalOptions};
5use std::io::{self};
6
7pub struct CrossTerminal {
16 terminal: ratatui::DefaultTerminal,
17}
18
19impl CrossTerminal {
20 pub fn new() -> io::Result<Self> {
23 Ok(Self {
24 terminal: ratatui::init(),
25 })
26 }
27
28 pub fn with_options(options: TerminalOptions) -> io::Result<Self> {
30 Ok(Self {
31 terminal: ratatui::init_with_options(options),
32 })
33 }
34}
35
36impl TerminalImpl for CrossTerminal {
49 type Event = event::Event;
50
51 fn event_stream(&mut self) -> io::Result<BoxStream<'static, Self::Event>> {
53 Ok(EventStream::new()
55 .filter_map(|event| async move { event.ok() })
56 .boxed())
57 }
58
59 fn received_ctrl_c(event: Self::Event) -> bool {
61 matches!(
62 event,
63 event::Event::Key(event::KeyEvent {
64 code: event::KeyCode::Char('c'),
65 modifiers: event::KeyModifiers::CONTROL,
66 kind: event::KeyEventKind::Press,
67 ..
68 })
69 )
70 }
71
72 fn draw<F>(&mut self, f: F) -> io::Result<()>
73 where
74 F: FnOnce(&mut Frame),
75 {
76 self.terminal.draw(f)?;
77 Ok(())
78 }
79
80 fn insert_before<F>(&mut self, height: u16, draw_fn: F) -> io::Result<()>
81 where
82 F: FnOnce(&mut ratatui::prelude::Buffer),
83 {
84 self.terminal.insert_before(height, draw_fn)?;
85 Ok(())
86 }
87}