Skip to main content

husako_core/
progress.rs

1/// Trait for reporting progress of long-running operations.
2///
3/// Core defines this trait; CLI implements it with `indicatif`.
4/// Tests use `SilentProgress` (no-op).
5pub trait ProgressReporter: Send + Sync {
6    fn start_task(&self, message: &str) -> Box<dyn TaskHandle>;
7}
8
9/// Handle for a single in-progress task.
10pub trait TaskHandle: Send + Sync {
11    fn set_message(&self, message: &str);
12    fn finish_ok(&self, message: &str);
13    fn finish_err(&self, message: &str);
14}
15
16/// No-op progress reporter for tests and non-interactive use.
17pub struct SilentProgress;
18
19impl ProgressReporter for SilentProgress {
20    fn start_task(&self, _message: &str) -> Box<dyn TaskHandle> {
21        Box::new(SilentTaskHandle)
22    }
23}
24
25struct SilentTaskHandle;
26
27impl TaskHandle for SilentTaskHandle {
28    fn set_message(&self, _message: &str) {}
29    fn finish_ok(&self, _message: &str) {}
30    fn finish_err(&self, _message: &str) {}
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn silent_progress_no_ops() {
39        let progress = SilentProgress;
40        let task = progress.start_task("test");
41        task.set_message("updated");
42        task.finish_ok("done");
43    }
44
45    #[test]
46    fn silent_progress_err() {
47        let progress = SilentProgress;
48        let task = progress.start_task("test");
49        task.finish_err("failed");
50    }
51}