41 lines
1.0 KiB
Rust
41 lines
1.0 KiB
Rust
use std::io::{self, Stdout};
|
|
|
|
use anyhow::Result;
|
|
use crossterm::cursor::{Hide, Show};
|
|
use crossterm::execute;
|
|
use crossterm::terminal::{
|
|
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
|
|
};
|
|
use ratatui::backend::CrosstermBackend;
|
|
use ratatui::Terminal;
|
|
|
|
pub type LimeTerminal = Terminal<CrosstermBackend<Stdout>>;
|
|
|
|
pub struct TerminalSession {
|
|
terminal: LimeTerminal,
|
|
}
|
|
|
|
impl TerminalSession {
|
|
pub fn enter() -> Result<Self> {
|
|
enable_raw_mode()?;
|
|
let mut stdout = io::stdout();
|
|
execute!(stdout, EnterAlternateScreen, Hide)?;
|
|
let backend = CrosstermBackend::new(stdout);
|
|
let mut terminal = Terminal::new(backend)?;
|
|
terminal.clear()?;
|
|
Ok(Self { terminal })
|
|
}
|
|
|
|
pub fn terminal_mut(&mut self) -> &mut LimeTerminal {
|
|
&mut self.terminal
|
|
}
|
|
}
|
|
|
|
impl Drop for TerminalSession {
|
|
fn drop(&mut self) {
|
|
let _ = disable_raw_mode();
|
|
let mut stdout = io::stdout();
|
|
let _ = execute!(stdout, Show, LeaveAlternateScreen);
|
|
}
|
|
}
|