1 //! Progress reporting, inverted.
2 //!
3 //! The engine calls a [`Reporter`] instead of touching the terminal. Each
4 //! front-end supplies its own implementation:
5 //! - the CLI renders steps as `spinners` lines with themed symbols,
6 //! - CI prints plain, timestamped lines,
7 //! - the server-side git receiver streams lines over the push sideband.
8
9 /// How the engine tells the outside world what it is doing.
10 ///
11 /// A "step" is one unit of work (detect runner, build, upload, restart). The
12 /// engine brackets each with [`step_start`](Reporter::step_start) and one of
13 /// [`step_done`](Reporter::step_done) / [`step_fail`](Reporter::step_fail).
14 pub trait Reporter: Send + Sync {
15 /// A unit of work has started.
16 fn step_start(&self, msg: &str);
17
18 /// The current step finished successfully.
19 fn step_done(&self, msg: &str);
20
21 /// The current step failed.
22 fn step_fail(&self, msg: &str);
23
24 /// An informational note not tied to a step. Defaults to no-op.
25 fn info(&self, msg: &str) {
26 let _ = msg;
27 }
28
29 /// A single line of streamed output from a build or the remote (e.g. a line
30 /// of `next build` output, or a git receive-pack message). Defaults to no-op.
31 fn remote_line(&self, line: &str) {
32 let _ = line;
33 }
34 }
35
36 /// A [`Reporter`] that discards everything.
37 ///
38 /// Useful for tests and for non-interactive callers that only care about the
39 /// final `Result`.
40 pub struct NoopReporter;
41
42 impl Reporter for NoopReporter {
43 fn step_start(&self, _msg: &str) {}
44 fn step_done(&self, _msg: &str) {}
45 fn step_fail(&self, _msg: &str) {}
46 }