YAMLabyrinth skeleton v0.0.1

This commit is contained in:
2026-05-21 16:46:14 +03:00
commit aa9cb6ea53
14 changed files with 1650 additions and 0 deletions

59
src/tui.rs Normal file
View File

@@ -0,0 +1,59 @@
use anyhow::Result;
use crossterm::event::{self, Event, KeyCode};
use crossterm::execute;
use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
};
use ratatui::backend::CrosstermBackend;
use ratatui::widgets::{Block, Borders, Paragraph};
use ratatui::Terminal;
use std::io::{stdout, Stdout};
pub fn run() -> Result<()> {
install_panic_hook();
let mut terminal = enter()?;
let result = main_loop(&mut terminal);
leave()?;
result
}
fn install_panic_hook() {
let prev = std::panic::take_hook();
std::panic::set_hook(Box::new(move |info| {
let _ = leave();
prev(info);
}));
}
fn enter() -> Result<Terminal<CrosstermBackend<Stdout>>> {
enable_raw_mode()?;
execute!(stdout(), EnterAlternateScreen)?;
Ok(Terminal::new(CrosstermBackend::new(stdout()))?)
}
fn leave() -> Result<()> {
disable_raw_mode()?;
execute!(stdout(), LeaveAlternateScreen)?;
Ok(())
}
fn main_loop(terminal: &mut Terminal<CrosstermBackend<Stdout>>) -> Result<()> {
loop {
terminal.draw(|frame| {
let block = Block::default()
.borders(Borders::ALL)
.title(" YAMLabyrinth ");
let body = Paragraph::new(
"Welcome to the YAML labyrinth.\n\nPress [q] to flee.",
)
.block(block);
frame.render_widget(body, frame.size());
})?;
if let Event::Key(key) = event::read()? {
if key.code == KeyCode::Char('q') {
return Ok(());
}
}
}
}