From: Ian Jackson Date: Fri, 21 May 2021 13:27:29 +0000 (+0100) Subject: termprogress: Provide Nest reporter X-Git-Tag: otter-0.6.0~112 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=2cb58447cf3e0c92e9b721e267283441427e5266;p=otter.git termprogress: Provide Nest reporter For iterating round a phase loop. Signed-off-by: Ian Jackson --- diff --git a/src/termprogress.rs b/src/termprogress.rs index db6f5a4f..b7a2d288 100644 --- a/src/termprogress.rs +++ b/src/termprogress.rs @@ -159,3 +159,48 @@ impl Drop for TermReporter { self.clear(); } } + +pub struct Nest { + outer_n: usize, + outer_i: usize, + inner_last_phase: usize, + actual_reporter: Box, +} + +impl Nest { + /// Assumes that every inner phase is of the same length as the first + pub fn new(outer_count: usize, actual_reporter: Box) + -> Self { Nest { + actual_reporter, + outer_n: outer_count, + outer_i: 0, + inner_last_phase: 0, + } } +} + +impl Reporter for Nest { + fn report(&mut self, inner_pi: &ProgressInfo<'_>) { + // Autodetect new outer phase item, when inner pahse rewinds + if inner_pi.phase.i < self.inner_last_phase { + self.outer_i += 1; + } + self.inner_last_phase = inner_pi.phase.i; + + let outer_phase = progress::Count { + i: inner_pi.phase.i + inner_pi.phase.n * self.outer_i, + n: inner_pi.phase.n * self.outer_n, + desc: inner_pi.phase.desc.clone(), + }; + + let outer_pi = ProgressInfo { + phase: outer_phase, + item: inner_pi.item.clone(), + }; + + self.actual_reporter.report(&outer_pi); + } + + fn clear(&mut self) { + self.actual_reporter.clear(); + } +}