Files
wifi-densepose/crates/rvf/rvf-import/src/progress.rs
ruv d803bfe2b1 Squashed 'vendor/ruvector/' content from commit b64c2172
git-subtree-dir: vendor/ruvector
git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
2026-02-28 14:39:40 -05:00

55 lines
1.4 KiB
Rust

//! Progress reporting for long-running imports.
use std::io::Write;
/// Trait for receiving import progress callbacks.
pub trait ProgressReporter {
/// Called after each batch with cumulative counts.
fn report(&self, imported: u64, rejected: u64, total: u64);
}
/// A reporter that prints progress to stderr.
pub struct StderrProgress;
impl ProgressReporter for StderrProgress {
fn report(&self, imported: u64, rejected: u64, total: u64) {
if total > 0 {
let pct = (imported + rejected) as f64 / total as f64 * 100.0;
eprint!("\r imported: {imported}, rejected: {rejected}, total: {total} ({pct:.1}%)");
let _ = std::io::stderr().flush();
}
}
}
/// A reporter that collects reports for testing.
pub struct CollectingProgress {
reports: std::sync::Mutex<Vec<(u64, u64, u64)>>,
}
impl Default for CollectingProgress {
fn default() -> Self {
Self {
reports: std::sync::Mutex::new(Vec::new()),
}
}
}
impl CollectingProgress {
pub fn new() -> Self {
Self::default()
}
pub fn reports(&self) -> Vec<(u64, u64, u64)> {
self.reports.lock().unwrap().clone()
}
}
impl ProgressReporter for CollectingProgress {
fn report(&self, imported: u64, rejected: u64, total: u64) {
self.reports
.lock()
.unwrap()
.push((imported, rejected, total));
}
}