use std::io::{Write, stdout};
use termimad::crossterm::{
cursor::{Hide, Show},
event::{self, Event, KeyCode::*, KeyEvent},
queue,
style::Color::*,
terminal::{self, Clear, ClearType, EnterAlternateScreen, LeaveAlternateScreen},
};
use termimad::*;
static DOCS: &str = include_str!("../../DOCS.md");
pub(crate) static MIGRATIONS: &str = include_str!("../../MIGRATIONS.md");
fn view_area() -> Area {
Area::full_screen()
}
pub(crate) fn run_app(skin: MadSkin, text: impl ToString) -> Result<(), Error> {
let mut w = stdout();
queue!(w, EnterAlternateScreen)?;
terminal::enable_raw_mode()?;
queue!(w, Hide)?;
let mut view = MadView::from(text.to_string(), view_area(), skin);
loop {
view.write_on(&mut w)?;
w.flush()?;
match event::read() {
Ok(Event::Key(KeyEvent { code, .. })) => match code {
Up => view.try_scroll_lines(-1),
Down => view.try_scroll_lines(1),
PageUp => view.try_scroll_pages(-1),
PageDown => view.try_scroll_pages(1),
Char('q') | Esc => break,
_ => {}
},
Ok(Event::Resize(..)) => {
queue!(w, Clear(ClearType::All))?;
view.resize(&view_area());
}
_ => {}
}
}
terminal::disable_raw_mode()?;
queue!(w, Show)?; queue!(w, LeaveAlternateScreen)?;
w.flush()?;
Ok(())
}
pub(crate) fn make_skin() -> MadSkin {
let mut skin = MadSkin::default();
skin.table.align = Alignment::Center;
skin.set_headers_fg(AnsiValue(178));
skin.bold.set_fg(Yellow);
skin.italic.set_fg(Magenta);
skin.scrollbar.thumb.set_fg(AnsiValue(178));
skin.code_block.align = Alignment::Left;
skin
}
pub fn read_docs() -> anyhow::Result<()> {
let skin = make_skin();
run_app(skin, DOCS)?;
Ok(())
}
pub fn read_migrations() -> anyhow::Result<()> {
let skin = make_skin();
run_app(skin, MIGRATIONS)?;
Ok(())
}