mod action;
mod app;
mod cast;
mod config;
mod event;
mod fs;
mod markdown;
mod mermaid;
mod state;
mod theme;
mod ui;
use anyhow::Result;
use app::App;
use clap::Parser;
use crossterm::{
cursor::Show,
event::{DisableMouseCapture, EnableMouseCapture},
execute,
terminal::{EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode},
};
use ratatui::prelude::*;
use std::path::PathBuf;
struct TerminalGuard;
impl Drop for TerminalGuard {
fn drop(&mut self) {
let _ = disable_raw_mode();
let _ = execute!(
std::io::stdout(),
LeaveAlternateScreen,
DisableMouseCapture,
Show,
);
}
}
#[derive(Parser, Debug)]
#[command(name = "markdown-reader", about = "A TUI markdown file viewer")]
struct Cli {
#[arg(default_value = ".")]
path: PathBuf,
}
#[tokio::main]
async fn main() -> Result<()> {
let cli = Cli::parse();
let canonical = cli.path.canonicalize()?;
let (root, initial_file) = if canonical.is_file() {
let parent = canonical
.parent()
.unwrap_or(std::path::Path::new("."))
.to_path_buf();
(parent, Some(canonical))
} else {
(canonical, None)
};
enable_raw_mode()?;
let mut stdout = std::io::stdout();
execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;
let _guard = TerminalGuard;
let backend = CrosstermBackend::new(stdout);
let mut terminal = Terminal::new(backend)?;
App::new(root, initial_file).run(&mut terminal).await
}