depl 2.4.3

Toolkit for a bunch of local and remote CI/CD actions
Documentation
//! Built-in documentation module.

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)?; // we must restore the cursor
  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
}

/// Starts documentation reader.
pub fn read_docs() -> anyhow::Result<()> {
  let skin = make_skin();
  run_app(skin, DOCS)?;
  Ok(())
}

/// Starts migrations reader.
pub fn read_migrations() -> anyhow::Result<()> {
  let skin = make_skin();
  run_app(skin, MIGRATIONS)?;
  Ok(())
}