rust-pager 0.2.4

Yet another pager in Rust
use crate::shared::{Buffer, RpLine};
use bumpalo::Bump;
use crossbeam_queue::ArrayQueue;
use crossterm::Result;
use std::{
    fs::File,
    io::{ErrorKind, Read},
    sync::{atomic::Ordering, Arc},
};

pub fn read_from_stdin<'b>(
    mut stdin: File,
    b: &'b mut Bump,
    tx: Arc<ArrayQueue<RpLine<'b>>>,
) -> Result<()> {
    let mut parser = vte::Parser::new();
    let mut buffer = Buffer::new(b, &tx);
    let mut stdin_buf = [0; 8196];

    loop {
        let buf = match stdin.read(&mut stdin_buf) {
            Ok(l) => &stdin_buf[..l],
            Err(ref e) if e.kind() == ErrorKind::Interrupted => continue,
            Err(e) => return Err(From::from(e)),
        };

        if buf.is_empty() {
            #[cfg(feature = "logging")]
            log::info!("EOF");
            if !buffer.is_empty() {
                buffer.flush();
            }
            break Ok(());
        }

        if !crate::RUN.load(Ordering::Acquire) {
            break Ok(());
        }

        buf.iter().for_each(|b| parser.advance(&mut buffer, *b));

        if buffer.is_full() {
            #[cfg(feature = "logging")]
            log::error!("Too long");
            buffer.flush();
            break Ok(());
        }
    }
}