straymark-cli 3.14.1

CLI for StrayMark — the cognitive discipline your AI-assisted projects need
pub mod app;
pub mod document;
pub mod event;
pub mod i18n_strings;
pub mod index;
pub mod markdown;
pub mod theme;
pub mod ui;
pub mod widgets;

use std::io;
use std::path::Path;

use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::execute;
use crossterm::terminal::{
    disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
};
use ratatui::backend::CrosstermBackend;
use ratatui::Terminal;

use app::App;

/// Run the TUI explorer
pub fn run(project_root: &Path, is_fallback: bool, language: &str) -> anyhow::Result<()> {
    // Setup terminal
    enable_raw_mode()?;
    let mut stdout = io::stdout();
    execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;
    let backend = CrosstermBackend::new(stdout);
    let mut terminal = Terminal::new(backend)?;

    // Create app state
    let mut app = App::new(project_root, is_fallback, language);

    // Main loop
    let result = run_loop(&mut terminal, &mut app);

    // Restore terminal
    disable_raw_mode()?;
    execute!(
        terminal.backend_mut(),
        LeaveAlternateScreen,
        DisableMouseCapture
    )?;
    terminal.show_cursor()?;

    result
}

fn run_loop(
    terminal: &mut Terminal<CrosstermBackend<io::Stdout>>,
    app: &mut App,
) -> anyhow::Result<()> {
    loop {
        terminal.draw(|frame| ui::render(frame, app))?;

        if event::handle_events(app)? && app.should_quit {
            return Ok(());
        }

        if app.should_quit {
            return Ok(());
        }
    }
}