more reworking bar + new log format

This commit is contained in:
2025-11-15 09:20:01 +00:00
parent f7fe3b0bb0
commit 2bc4fdcc79
12 changed files with 270555 additions and 38 deletions

33
src/bin/main.rs Normal file
View File

@@ -0,0 +1,33 @@
use std::thread::sleep;
use std::time::{Duration, Instant};
use color_eyre::eyre::ContextCompat;
use console::Term;
use nix_output::action;
use nix_output::state::State;
fn main() -> Result<(), color_eyre::Report> {
color_eyre::install().unwrap();
let mut args = std::env::args().skip(1);
let first = args.next().context("Failed to get first arg")?;
let lines = std::fs::read_to_string(first)?;
let mut state = State::new(Term::stderr().size().1);
let start = Instant::now();
for line in lines.lines() {
let mut time = line.split("~");
let instant = time.next().unwrap(); // impossible to fail
let instant: u128 = instant.parse()?;
let elapsed = start.elapsed().as_millis();
if instant > elapsed {
sleep(Duration::from_millis(instant.saturating_sub(elapsed) as u64));
}
let line = time.collect::<String>();
let line = line.strip_prefix("@nix ").unwrap_or(&line);
let action = action::Action::parse(line)?;
state.handle(&action)?;
}
Ok(())
}

27
src/bin/record.rs Normal file
View File

@@ -0,0 +1,27 @@
use core::time;
use std::{
fs::File,
io::{BufRead, BufReader, Write},
time::{Instant, SystemTime},
};
fn main() -> Result<(), color_eyre::Report> {
color_eyre::install().unwrap();
let stderr = std::io::stdin();
let mut lines = BufReader::new(stderr).lines();
let now = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH)?;
let mut file = File::options()
.create_new(true)
.write(true)
.truncate(true)
.open(format!("{}.log", now.as_secs()))?;
let start = Instant::now();
while let Some(Ok(next)) = lines.next() {
let line = format!("{}~{next}\n", start.elapsed().as_millis());
file.write_all(line.as_bytes())?;
}
file.flush()?;
Ok(())
}

View File

@@ -24,9 +24,12 @@ pub fn style_bar<'s, const N: usize>(
if remaining_width == 0 {
return status;
}
let remaining_width = remaining_width.saturating_sub((INFO_WIDTH as u16 + 3) * 2);
let possible_chunks = remaining_width.saturating_div(INFO_WIDTH as u16 + 3);
let possible_chunks = possible_chunks.min(3);
let leftover_width = remaining_width.saturating_sub(possible_chunks * (INFO_WIDTH as u16 + 3));
let possible_chunks = possible_chunks.min(4);
let leftover_width = ((INFO_WIDTH as u16 + 3) * 2)
+ remaining_width.saturating_sub(possible_chunks * (INFO_WIDTH as u16 + 3));
let download_done_human = pad_string(
DOWNLOAD_STYLE
.style(HumanBytes(download_done as u64).to_string())
@@ -44,7 +47,7 @@ pub fn style_bar<'s, const N: usize>(
let bar = bar.scale(leftover_width as u64).to_string();
match possible_chunks {
0 => format!("{status} | {download_done_human}"),
0 => format!("{status} | [{bar}]"),
1 => format!("{status} | {download_done_human} | [{bar}]"),
2 => format!("{status} | {work_per_sec} | {download_done_human} | [{bar}]"),
_ => {

View File

@@ -14,6 +14,12 @@ impl Handler for GlobalHandler {
action: &crate::action::Action,
) -> color_eyre::Result<bool> {
match action {
Action::Msg { level, msg } => {
if *level > 4 {
state.println(format!("{level}: {msg}"))?;
}
Ok(true)
}
Action::Start {
start_type: StartFields::QueryPathInfo { path, source },
id,

9
src/lib.rs Normal file
View File

@@ -0,0 +1,9 @@
pub mod action;
pub mod action_raw;
pub mod download_display;
pub mod estimator;
pub mod handlers;
pub mod multibar;
pub mod nix_path;
pub mod state;
pub mod util;

View File

@@ -1,34 +0,0 @@
use std::sync::LazyLock;
use std::thread::sleep;
use std::time::Duration;
use console::Term;
use owo_colors::OwoColorize;
use crate::state::State;
pub mod action;
pub mod action_raw;
pub mod download_display;
pub mod estimator;
pub mod handlers;
pub mod multibar;
pub mod nix_path;
pub mod state;
pub mod util;
fn main() -> Result<(), color_eyre::Report> {
color_eyre::install().unwrap();
let lines = std::fs::read_to_string("build.log")?;
let mut state = State::new(Term::stderr().size().1);
for line in lines.lines() {
let line = line.strip_prefix("@nix ").unwrap_or(line);
sleep(Duration::from_millis(1));
let action = action::Action::parse(line)?;
state.handle(&action)?;
}
Ok(())
}