Skip to main content

tokio_process_tools/process_handle/
replay.rs

1use super::ProcessHandle;
2use crate::output_stream::OutputStream;
3use crate::output_stream::backend::broadcast::BroadcastOutputStream;
4use crate::output_stream::backend::single_subscriber::SingleSubscriberOutputStream;
5use crate::output_stream::policy::{Delivery, ReplayEnabled};
6
7/// Generates `seal_stdout_replay` for any `ProcessHandle` whose stdout is the named replay-enabled
8/// backend. The stderr slot stays free in the type parameters so each backend has one impl block
9/// regardless of what the caller paired it with on stderr.
10macro_rules! impl_seal_stdout_replay {
11    ($stdout:ident) => {
12        impl<StdoutD, Stderr> ProcessHandle<$stdout<StdoutD, ReplayEnabled>, Stderr>
13        where
14            StdoutD: Delivery,
15            Stderr: OutputStream,
16        {
17            /// Seals stdout replay history for future subscribers.
18            pub fn seal_stdout_replay(&self) {
19                self.std_out_stream.seal_replay();
20            }
21        }
22    };
23}
24
25/// Mirror of [`impl_seal_stdout_replay`] for the stderr slot.
26macro_rules! impl_seal_stderr_replay {
27    ($stderr:ident) => {
28        impl<Stdout, StderrD> ProcessHandle<Stdout, $stderr<StderrD, ReplayEnabled>>
29        where
30            Stdout: OutputStream,
31            StderrD: Delivery,
32        {
33            /// Seals stderr replay history for future subscribers.
34            pub fn seal_stderr_replay(&self) {
35                self.std_err_stream.seal_replay();
36            }
37        }
38    };
39}
40
41/// Generates `seal_output_replay` for the cartesian product of replay-enabled backends across
42/// stdout and stderr. Delegates to the per-stream methods so the actual sealing logic stays in
43/// one place.
44macro_rules! impl_seal_output_replay {
45    ($stdout:ident, $stderr:ident) => {
46        impl<StdoutD, StderrD>
47            ProcessHandle<$stdout<StdoutD, ReplayEnabled>, $stderr<StderrD, ReplayEnabled>>
48        where
49            StdoutD: Delivery,
50            StderrD: Delivery,
51        {
52            /// Seals stdout and stderr replay history for replay-enabled streams.
53            pub fn seal_output_replay(&self) {
54                self.seal_stdout_replay();
55                self.seal_stderr_replay();
56            }
57        }
58    };
59}
60
61impl_seal_stdout_replay!(BroadcastOutputStream);
62impl_seal_stdout_replay!(SingleSubscriberOutputStream);
63impl_seal_stderr_replay!(BroadcastOutputStream);
64impl_seal_stderr_replay!(SingleSubscriberOutputStream);
65impl_seal_output_replay!(BroadcastOutputStream, BroadcastOutputStream);
66impl_seal_output_replay!(BroadcastOutputStream, SingleSubscriberOutputStream);
67impl_seal_output_replay!(SingleSubscriberOutputStream, BroadcastOutputStream);
68impl_seal_output_replay!(SingleSubscriberOutputStream, SingleSubscriberOutputStream);