pinix 0.3.0

Progress In Nix - Pacman inspired frontend for Nix
Documentation
use std::cmp::max;

use indicatif::{HumanCount, ProgressBar, ProgressFinish, ProgressStyle};

use crate::action::Action;
use crate::state::{Handler, HandlerResult, State};
use crate::style::template_style;

fn build_style(size: u16) -> ProgressStyle {
    template_style(
        size,
        true,
        |_| "🔧 {wide_msg} {pos:>5}/{len:<6}",
        |size| format!("[{{bar:{size}}}]"),
    )
}

pub struct DebugHandler {
    progress: ProgressBar,
    nb_lines: u64,
}

impl DebugHandler {
    pub fn new(state: &mut State) -> Self {
        let progress = ProgressBar::new_spinner()
            .with_style(build_style(state.term_size))
            .with_finish(ProgressFinish::Abandon);

        let progress = state.add(progress);

        DebugHandler {
            progress,
            nb_lines: 0,
        }
    }
}

impl Handler for DebugHandler {
    fn on_action(&mut self, state: &mut State, _action: &Action) -> anyhow::Result<HandlerResult> {
        let handlers_len = state.handlers_len as _;
        self.nb_lines += 1;

        self.progress
            .set_length(max(handlers_len, self.progress.length().unwrap_or(0)));

        self.progress
            .set_message(format!("Parsed {} lines of log", HumanCount(self.nb_lines)));

        self.progress.set_position(handlers_len);
        Ok(HandlerResult::Continue)
    }

    fn on_resize(&mut self, state: &mut State) -> anyhow::Result<()> {
        self.progress.set_style(build_style(state.term_size));
        Ok(())
    }
}