background_color/
background_color.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 ratatui::layout::Alignment;
13use ratatui::style::Stylize;
14use ratatui::widgets::{Block, BorderType, Padding, Paragraph};
15use syntect_assets::assets::HighlightingAssets;
16use tui_syntax_highlight::Highlighter;
17
18type Terminal = ratatui::Terminal<CrosstermBackend<Stdout>>;
19type Result<T> = std::result::Result<T, Box<dyn Error>>;
20
21thread_local! {
22    static ASSETS: LazyCell<HighlightingAssets> = LazyCell::new(HighlightingAssets::from_binary);
23}
24
25fn main() -> Result<()> {
26    let mut terminal = setup_terminal()?;
27    let theme = ASSETS.with(|a| a.get_theme("Nord").clone());
28    let highlighter = Highlighter::new(theme);
29    let syntaxes = ASSETS.with(|a| a.get_syntax_set().cloned())?;
30    let syntax = syntaxes
31        .find_syntax_by_name("Rust")
32        .expect("syntax missing");
33    let highlight = highlighter.highlight_reader(
34        File::open("./examples/sqlite_custom/build.rs")?,
35        syntax,
36        &syntaxes,
37    )?;
38
39    let bg = highlighter.get_background_color().unwrap_or_default();
40    // Set the background on the text container so it matches.
41    let paragraph = Paragraph::new(highlight).bg(bg).block(
42        Block::bordered()
43            .border_type(BorderType::Rounded)
44            .padding(Padding::uniform(0))
45            .title("Syntax Highlight!")
46            .title_alignment(Alignment::Center),
47    );
48    terminal.draw(|frame| {
49        frame.render_widget(paragraph, frame.area());
50    })?;
51    read()?;
52    restore_terminal(terminal)?;
53    Ok(())
54}
55
56fn setup_terminal() -> Result<Terminal> {
57    enable_raw_mode()?;
58    let mut stdout = stdout();
59    execute!(stdout, EnterAlternateScreen)?;
60    let backend = CrosstermBackend::new(stdout);
61    let terminal = Terminal::new(backend)?;
62    Ok(terminal)
63}
64
65fn restore_terminal(mut terminal: Terminal) -> Result<()> {
66    disable_raw_mode()?;
67    execute!(terminal.backend_mut(), LeaveAlternateScreen)?;
68    Ok(())
69}