glyph-tui 0.1.0

A terminal UI for visualizing data
use crossterm::{
    cursor::DisableBlinking,
    event::{self, Event, KeyCode, KeyEventKind},
    execute,
    terminal::{EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode},
};
use ratatui::{
    Terminal,
    backend::CrosstermBackend,
    layout::{Constraint, Layout},
    style::{Color, Style},
    text::{Line, Span},
    widgets::{Block, Borders, Paragraph},
};
use std::io;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut io = io::stdout();

    enable_raw_mode()?;
    execute!(io, EnterAlternateScreen, DisableBlinking)?;

    let mut terminal = Terminal::new(CrosstermBackend::new(io))?;

    let message = Line::from(vec![
        Span::styled("Hello, ", Style::default().fg(Color::White)),
        Span::styled("glyph!", Style::default().fg(Color::Cyan)),
    ]);

    let paragraph =
        Paragraph::new(message).block(Block::default().borders(Borders::ALL).title(" glyph-tui "));

    terminal.draw(|frame| {
        let area = frame.area();
        let layout =
            Layout::vertical([Constraint::Fill(1), Constraint::Min(1), Constraint::Fill(1)])
                .split(area);

        let horizontal = Layout::horizontal([
            Constraint::Fill(1),
            Constraint::Min(40),
            Constraint::Fill(1),
        ])
        .split(layout[1]);

        frame.render_widget(paragraph, horizontal[1]);
    })?;

    // Wait for any key press
    loop {
        if event::poll(std::time::Duration::from_millis(16))? {
            if let Event::Key(key) = event::read()? {
                if key.kind == KeyEventKind::Press
                    && matches!(key.code, KeyCode::Esc | KeyCode::Char('q'))
                {
                    break;
                }
            }
        }
    }

    drop(terminal);
    disable_raw_mode()?;
    execute!(io::stdout(), LeaveAlternateScreen)?;

    Ok(())
}