highlight_file/
highlight_file.rs

1use std::cell::LazyCell;
2use std::error::Error;
3use std::fs::File;
4use std::io::{Stdout, stdout};
5
6use ratatui::backend::CrosstermBackend;
7use ratatui::crossterm::event::read;
8use ratatui::crossterm::execute;
9use ratatui::crossterm::terminal::{
10    EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode,
11};
12use syntect_assets::assets::HighlightingAssets;
13use tui_syntax_highlight::Highlighter;
14
15type Terminal = ratatui::Terminal<CrosstermBackend<Stdout>>;
16type Result<T> = std::result::Result<T, Box<dyn Error>>;
17
18thread_local! {
19    static ASSETS: LazyCell<HighlightingAssets> = LazyCell::new(HighlightingAssets::from_binary);
20}
21
22fn main() -> Result<()> {
23    let mut terminal = setup_terminal()?;
24    let theme = ASSETS.with(|a| a.get_theme("Nord").clone());
25    let highlighter = Highlighter::new(theme);
26    let syntaxes = ASSETS.with(|a| a.get_syntax_set().cloned())?;
27    let syntax = syntaxes
28        .find_syntax_by_name("Rust")
29        .expect("syntax missing");
30    let highlighted_text = highlighter.highlight_reader(
31        File::open("./examples/sqlite_custom/build.rs")?,
32        syntax,
33        &syntaxes,
34    )?;
35    terminal.draw(|frame| {
36        frame.render_widget(highlighted_text, frame.area());
37    })?;
38    read()?;
39    restore_terminal(terminal)?;
40    Ok(())
41}
42
43fn setup_terminal() -> Result<Terminal> {
44    enable_raw_mode()?;
45    let mut stdout = stdout();
46    execute!(stdout, EnterAlternateScreen)?;
47    let backend = CrosstermBackend::new(stdout);
48    let terminal = Terminal::new(backend)?;
49    Ok(terminal)
50}
51
52fn restore_terminal(mut terminal: Terminal) -> Result<()> {
53    disable_raw_mode()?;
54    execute!(terminal.backend_mut(), LeaveAlternateScreen)?;
55    Ok(())
56}