tts-tui 0.1.4

Clipboard Narrator in the terminal
Documentation
use crossterm::terminal::LeaveAlternateScreen;
use std::{io, process};
use tts_tui::app::{App, AppResult};
use tts_tui::event::{Event, EventHandler};
use tts_tui::handler::handle_key_events;
use tts_tui::tui::Tui;
use tui::backend::CrosstermBackend;
use tui::Terminal;

const NAME: &str = env!("CARGO_PKG_NAME");
const VERSION: &str = env!("CARGO_PKG_VERSION");
const REPO: &str = env!("CARGO_PKG_REPOSITORY");

fn main() -> AppResult<()> {
    let mut args = std::env::args();
    match args.nth(1) {
        Some(arg) if arg == "--version" || arg.starts_with("-V") => {
            println!("{NAME} {VERSION}\n");
            process::exit(0);
        }
        Some(arg) if arg == "--help" || arg.starts_with("-h") => {
            println!("{NAME} {VERSION}");
            println!(env!("CARGO_PKG_DESCRIPTION"));
            println!("{}/releases/tag/{VERSION}\n", REPO);
            println!("The only options are --version and --help\n");
            println!("USAGE:");
            println!("  <space>\n  \tToggle speech");
            println!("  <s>\n  \tStop speech");
            println!("  <t>\n  \tToggle newlines");
            // println!("  <number>\n  \tHistory");
            println!("  <up/k>\n  \tScroll up");
            println!("  <down/j>\n  \tScroll down");
            println!("  <left/h>\n  \tLast paragraph");
            println!("  <right/l>\n  \tNext paragraph");
            println!();
            process::exit(0);
        }
        Some(arg) if arg.starts_with('-') => {
            if arg.starts_with("--") {
                eprintln!(
                    "error: unexpected option '{}' found",
                    arg.split_whitespace().next().unwrap(),
                );
            } else {
                eprintln!(
                    "error: unexpected option '{}' found",
                    arg.get(..2).get_or_insert("-")
                );
            }
            eprintln!("\n  try --help\n");
            process::exit(0);
        }
        _ => {}
    }
    let original_hook = std::panic::take_hook();

    std::panic::set_hook(Box::new(move |panic| {
        let _ = crossterm::terminal::disable_raw_mode();
        let _ = crossterm::execute!(io::stderr(), LeaveAlternateScreen);
        original_hook(panic);
    }));

    let mut app = App::new();

    let backend = CrosstermBackend::new(io::stderr());
    let terminal = Terminal::new(backend)?;
    let events = EventHandler::new(250);
    let mut tui = Tui::new(terminal, events);
    tui.init(&app)?;
    // TTS options shortcut seems unnecessary, this is fine
    app.tts.set_rate(1.5).unwrap();
    while app.running {
        tui.draw(&mut app)?;
        match tui.events.next()? {
            Event::Tick => app.tick(),
            Event::Key(key_event) => handle_key_events(key_event, &mut app)?,
            Event::Mouse(_) => {}
            Event::Resize(_, _) => {}
        }
    }

    tui.exit()?;
    Ok(())
}