use crate::{init, utils};
use crate::error::AlternateScreenPagingError;
use crate::Pager;
use crossterm::terminal;
use crossterm::tty::IsTty;
use std::io::{self, Write};
#[derive(Debug, thiserror::Error)]
pub enum PageAllError {
#[error(transparent)]
Io(#[from] std::io::Error),
#[error(transparent)]
Paging(#[from] AlternateScreenPagingError),
#[error("Failed to determine terminal size")]
TerminalSize(crossterm::ErrorKind),
}
#[cfg_attr(
feature = "async_std_lib",
doc = "- [`async_std_updating`](crate::async_std_updating)\n"
)]
#[cfg_attr(
feature = "tokio_lib",
doc = "- [`tokio_updating`](crate::tokio_updating)\n"
)]
#[cfg_attr(
not(any(feature = "async_std_lib", feature = "tokio_lib")),
doc = "- Asynchronous features are disabled, see [here](crate#features) for more information.\n"
)]
pub fn page_all(mut p: Pager) -> Result<(), PageAllError> {
let stdout = io::stdout();
let line_count = p.lines.lines().count();
{
if !stdout.is_tty() {
let mut out = stdout.lock();
utils::write_lines(&mut out, &mut p, line_count)?;
out.flush()?;
return Ok(());
}
}
{
let (_, rows) = terminal::size().map_err(PageAllError::TerminalSize)?;
let rows = rows as usize;
if rows > line_count {
let mut out = stdout.lock();
utils::write_lines(&mut out, &mut p, line_count)?;
out.flush()?;
} else {
init::static_paging(p)?;
}
Ok(())
}
}