use termwiz::terminal::Terminal as _;
use super::{TerminalAdapter, TerminalResult};
use crate::ratatui::backend::TermwizBackend;
use crate::ratatui::{Terminal, TerminalOptions};
use crate::terminal::TerminalError;
pub struct TermwizTerminalAdapter {
terminal: Terminal<TermwizBackend>,
}
impl TermwizTerminalAdapter {
pub fn new() -> TerminalResult<Self> {
Self::new_with_options(TerminalOptions::default())
}
pub fn new_with_options(options: TerminalOptions) -> TerminalResult<Self> {
let backend = TermwizBackend::new().map_err(|_| TerminalError::CannotConnectStdout)?;
let terminal = Terminal::with_options(backend, options)
.map_err(|_| TerminalError::CannotConnectStdout)?;
Ok(Self { terminal })
}
}
impl TerminalAdapter for TermwizTerminalAdapter {
type Backend = TermwizBackend;
fn enable_raw_mode(&mut self) -> TerminalResult<()> {
self.terminal
.backend_mut()
.buffered_terminal_mut()
.terminal()
.set_raw_mode()
.map_err(|_| TerminalError::CannotToggleRawMode)
}
fn disable_raw_mode(&mut self) -> TerminalResult<()> {
Err(TerminalError::Unsupported)
}
fn enter_alternate_screen(&mut self) -> TerminalResult<()> {
self.terminal
.backend_mut()
.buffered_terminal_mut()
.terminal()
.enter_alternate_screen()
.map_err(|_| TerminalError::CannotEnterAlternateMode)
}
fn leave_alternate_screen(&mut self) -> TerminalResult<()> {
self.terminal
.backend_mut()
.buffered_terminal_mut()
.terminal()
.exit_alternate_screen()
.map_err(|_| TerminalError::CannotLeaveAlternateMode)
}
fn enable_mouse_capture(&mut self) -> TerminalResult<()> {
Err(TerminalError::Unsupported)
}
fn disable_mouse_capture(&mut self) -> TerminalResult<()> {
Err(TerminalError::Unsupported)
}
fn raw_mut(&mut self) -> &mut Terminal<TermwizBackend> {
&mut self.terminal
}
fn raw(&self) -> &Terminal<TermwizBackend> {
&self.terminal
}
}