pub struct SupervisorHandle { /* private fields */ }Expand description
Cloneable handle used to control a running supervisor.
Implementations§
Source§impl SupervisorHandle
impl SupervisorHandle
Sourcepub fn new(
command_sender: Sender<RuntimeCommand>,
event_sender: Sender<String>,
) -> Self
pub fn new( command_sender: Sender<RuntimeCommand>, event_sender: Sender<String>, ) -> Self
Creates a runtime handle from channel senders.
§Arguments
command_sender: Sender used to submit runtime commands.event_sender: Sender used to subscribe to lifecycle events.
§Returns
Returns a SupervisorHandle.
Sourcepub async fn add_child(
&self,
target: SupervisorPath,
child_manifest: impl Into<String>,
requested_by: impl Into<String>,
reason: impl Into<String>,
) -> Result<CommandResult, SupervisorError>
pub async fn add_child( &self, target: SupervisorPath, child_manifest: impl Into<String>, requested_by: impl Into<String>, reason: impl Into<String>, ) -> Result<CommandResult, SupervisorError>
Adds a child manifest under a supervisor path.
§Arguments
target: Supervisor path that should receive the child.child_manifest: Child manifest text supplied by the caller.requested_by: Actor that requested the command.reason: Human-readable command reason.
§Returns
Returns a CommandResult after the runtime accepts the command.
Examples found in repository?
19async fn main() -> ExampleResult {
20 // Load centralized YAML configuration.
21 let state = load_config_state("examples/config/supervisor.yaml")?;
22 // Derive the supervisor specification from configuration.
23 let spec = state.to_supervisor_spec()?;
24 // Start the supervisor runtime from the specification.
25 let handle = Supervisor::start(spec).await?;
26 // Subscribe to runtime event text.
27 let mut events = handle.subscribe_events();
28 // Build the child identifier used by operator commands.
29 let child_id = ChildId::new("market_feed");
30
31 // Send an add child command through the control handle.
32 let add = handle
33 // Add a manifest under the root supervisor.
34 .add_child(
35 // Target the root supervisor.
36 SupervisorPath::root(),
37 // Provide the child manifest text.
38 "id=market_feed kind=AsyncWorker readiness=Explicit",
39 // Provide the requesting actor.
40 "operator",
41 // Provide the audit reason.
42 "attach market feed during incident rehearsal",
43 // Finish the add child arguments.
44 )
45 // Wait for the add child command result.
46 .await?;
47 // Print the add child result.
48 print_result("add_child", add);
49
50 // Print the pause child result.
51 print_result(
52 // Label the pause result.
53 "pause_child",
54 // Send the pause child command.
55 handle
56 // Pause automatic governance.
57 .pause_child(child_id.clone(), "operator", "stop automatic restart")
58 // Wait for the pause result.
59 .await?,
60 // Finish the pause result print call.
61 );
62 // Print the resume child result.
63 print_result(
64 // Label the resume result.
65 "resume_child",
66 // Send the resume child command.
67 handle
68 // Resume lifecycle governance.
69 .resume_child(child_id.clone(), "operator", "resume lifecycle governance")
70 // Wait for the resume result.
71 .await?,
72 // Finish the resume result print call.
73 );
74 // Print the quarantine child result.
75 print_result(
76 // Label the quarantine result.
77 "quarantine_child",
78 // Send the quarantine child command.
79 handle
80 // Quarantine the child for manual investigation.
81 .quarantine_child(child_id, "operator", "manual investigation")
82 // Wait for the quarantine result.
83 .await?,
84 // Finish the quarantine result print call.
85 );
86 // Print the current state result.
87 print_result("current_state", handle.current_state().await?);
88
89 // Drain already available runtime events.
90 while let Ok(event) = events.try_recv() {
91 // Print one runtime event.
92 println!("event={event}");
93 // Finish the event drain loop.
94 }
95
96 // Print the shutdown result.
97 print_result(
98 // Label the shutdown result.
99 "shutdown_tree",
100 // Send the shutdown command.
101 handle
102 // Request tree shutdown.
103 .shutdown_tree("operator", "runtime control story complete")
104 // Wait for the shutdown result.
105 .await?,
106 // Finish the shutdown result print call.
107 );
108
109 // Finish the example successfully.
110 Ok(())
111 // End the runtime control example.
112}Sourcepub async fn remove_child(
&self,
child_id: ChildId,
requested_by: impl Into<String>,
reason: impl Into<String>,
) -> Result<CommandResult, SupervisorError>
pub async fn remove_child( &self, child_id: ChildId, requested_by: impl Into<String>, reason: impl Into<String>, ) -> Result<CommandResult, SupervisorError>
Removes a child from runtime governance.
§Arguments
child_id: Target child identifier.requested_by: Actor that requested the command.reason: Human-readable command reason.
§Returns
Returns a CommandResult after removal or idempotent reuse.
Sourcepub async fn restart_child(
&self,
child_id: ChildId,
requested_by: impl Into<String>,
reason: impl Into<String>,
) -> Result<CommandResult, SupervisorError>
pub async fn restart_child( &self, child_id: ChildId, requested_by: impl Into<String>, reason: impl Into<String>, ) -> Result<CommandResult, SupervisorError>
Restarts a child explicitly.
§Arguments
child_id: Target child identifier.requested_by: Actor that requested the command.reason: Human-readable command reason.
§Returns
Returns a CommandResult after restart dispatch.
Sourcepub async fn pause_child(
&self,
child_id: ChildId,
requested_by: impl Into<String>,
reason: impl Into<String>,
) -> Result<CommandResult, SupervisorError>
pub async fn pause_child( &self, child_id: ChildId, requested_by: impl Into<String>, reason: impl Into<String>, ) -> Result<CommandResult, SupervisorError>
Pauses a child idempotently.
§Arguments
child_id: Target child identifier.requested_by: Actor that requested the command.reason: Human-readable command reason.
§Returns
Returns the current child state after the command.
Examples found in repository?
19async fn main() -> ExampleResult {
20 // Load centralized YAML configuration.
21 let state = load_config_state("examples/config/supervisor.yaml")?;
22 // Derive the supervisor specification from configuration.
23 let spec = state.to_supervisor_spec()?;
24 // Start the supervisor runtime from the specification.
25 let handle = Supervisor::start(spec).await?;
26 // Subscribe to runtime event text.
27 let mut events = handle.subscribe_events();
28 // Build the child identifier used by operator commands.
29 let child_id = ChildId::new("market_feed");
30
31 // Send an add child command through the control handle.
32 let add = handle
33 // Add a manifest under the root supervisor.
34 .add_child(
35 // Target the root supervisor.
36 SupervisorPath::root(),
37 // Provide the child manifest text.
38 "id=market_feed kind=AsyncWorker readiness=Explicit",
39 // Provide the requesting actor.
40 "operator",
41 // Provide the audit reason.
42 "attach market feed during incident rehearsal",
43 // Finish the add child arguments.
44 )
45 // Wait for the add child command result.
46 .await?;
47 // Print the add child result.
48 print_result("add_child", add);
49
50 // Print the pause child result.
51 print_result(
52 // Label the pause result.
53 "pause_child",
54 // Send the pause child command.
55 handle
56 // Pause automatic governance.
57 .pause_child(child_id.clone(), "operator", "stop automatic restart")
58 // Wait for the pause result.
59 .await?,
60 // Finish the pause result print call.
61 );
62 // Print the resume child result.
63 print_result(
64 // Label the resume result.
65 "resume_child",
66 // Send the resume child command.
67 handle
68 // Resume lifecycle governance.
69 .resume_child(child_id.clone(), "operator", "resume lifecycle governance")
70 // Wait for the resume result.
71 .await?,
72 // Finish the resume result print call.
73 );
74 // Print the quarantine child result.
75 print_result(
76 // Label the quarantine result.
77 "quarantine_child",
78 // Send the quarantine child command.
79 handle
80 // Quarantine the child for manual investigation.
81 .quarantine_child(child_id, "operator", "manual investigation")
82 // Wait for the quarantine result.
83 .await?,
84 // Finish the quarantine result print call.
85 );
86 // Print the current state result.
87 print_result("current_state", handle.current_state().await?);
88
89 // Drain already available runtime events.
90 while let Ok(event) = events.try_recv() {
91 // Print one runtime event.
92 println!("event={event}");
93 // Finish the event drain loop.
94 }
95
96 // Print the shutdown result.
97 print_result(
98 // Label the shutdown result.
99 "shutdown_tree",
100 // Send the shutdown command.
101 handle
102 // Request tree shutdown.
103 .shutdown_tree("operator", "runtime control story complete")
104 // Wait for the shutdown result.
105 .await?,
106 // Finish the shutdown result print call.
107 );
108
109 // Finish the example successfully.
110 Ok(())
111 // End the runtime control example.
112}Sourcepub async fn resume_child(
&self,
child_id: ChildId,
requested_by: impl Into<String>,
reason: impl Into<String>,
) -> Result<CommandResult, SupervisorError>
pub async fn resume_child( &self, child_id: ChildId, requested_by: impl Into<String>, reason: impl Into<String>, ) -> Result<CommandResult, SupervisorError>
Resumes a child idempotently.
§Arguments
child_id: Target child identifier.requested_by: Actor that requested the command.reason: Human-readable command reason.
§Returns
Returns the current child state after the command.
Examples found in repository?
19async fn main() -> ExampleResult {
20 // Load centralized YAML configuration.
21 let state = load_config_state("examples/config/supervisor.yaml")?;
22 // Derive the supervisor specification from configuration.
23 let spec = state.to_supervisor_spec()?;
24 // Start the supervisor runtime from the specification.
25 let handle = Supervisor::start(spec).await?;
26 // Subscribe to runtime event text.
27 let mut events = handle.subscribe_events();
28 // Build the child identifier used by operator commands.
29 let child_id = ChildId::new("market_feed");
30
31 // Send an add child command through the control handle.
32 let add = handle
33 // Add a manifest under the root supervisor.
34 .add_child(
35 // Target the root supervisor.
36 SupervisorPath::root(),
37 // Provide the child manifest text.
38 "id=market_feed kind=AsyncWorker readiness=Explicit",
39 // Provide the requesting actor.
40 "operator",
41 // Provide the audit reason.
42 "attach market feed during incident rehearsal",
43 // Finish the add child arguments.
44 )
45 // Wait for the add child command result.
46 .await?;
47 // Print the add child result.
48 print_result("add_child", add);
49
50 // Print the pause child result.
51 print_result(
52 // Label the pause result.
53 "pause_child",
54 // Send the pause child command.
55 handle
56 // Pause automatic governance.
57 .pause_child(child_id.clone(), "operator", "stop automatic restart")
58 // Wait for the pause result.
59 .await?,
60 // Finish the pause result print call.
61 );
62 // Print the resume child result.
63 print_result(
64 // Label the resume result.
65 "resume_child",
66 // Send the resume child command.
67 handle
68 // Resume lifecycle governance.
69 .resume_child(child_id.clone(), "operator", "resume lifecycle governance")
70 // Wait for the resume result.
71 .await?,
72 // Finish the resume result print call.
73 );
74 // Print the quarantine child result.
75 print_result(
76 // Label the quarantine result.
77 "quarantine_child",
78 // Send the quarantine child command.
79 handle
80 // Quarantine the child for manual investigation.
81 .quarantine_child(child_id, "operator", "manual investigation")
82 // Wait for the quarantine result.
83 .await?,
84 // Finish the quarantine result print call.
85 );
86 // Print the current state result.
87 print_result("current_state", handle.current_state().await?);
88
89 // Drain already available runtime events.
90 while let Ok(event) = events.try_recv() {
91 // Print one runtime event.
92 println!("event={event}");
93 // Finish the event drain loop.
94 }
95
96 // Print the shutdown result.
97 print_result(
98 // Label the shutdown result.
99 "shutdown_tree",
100 // Send the shutdown command.
101 handle
102 // Request tree shutdown.
103 .shutdown_tree("operator", "runtime control story complete")
104 // Wait for the shutdown result.
105 .await?,
106 // Finish the shutdown result print call.
107 );
108
109 // Finish the example successfully.
110 Ok(())
111 // End the runtime control example.
112}Sourcepub async fn quarantine_child(
&self,
child_id: ChildId,
requested_by: impl Into<String>,
reason: impl Into<String>,
) -> Result<CommandResult, SupervisorError>
pub async fn quarantine_child( &self, child_id: ChildId, requested_by: impl Into<String>, reason: impl Into<String>, ) -> Result<CommandResult, SupervisorError>
Quarantines a child idempotently.
§Arguments
child_id: Target child identifier.requested_by: Actor that requested the command.reason: Human-readable command reason.
§Returns
Returns the current child state after the command.
Examples found in repository?
19async fn main() -> ExampleResult {
20 // Load centralized YAML configuration.
21 let state = load_config_state("examples/config/supervisor.yaml")?;
22 // Derive the supervisor specification from configuration.
23 let spec = state.to_supervisor_spec()?;
24 // Start the supervisor runtime from the specification.
25 let handle = Supervisor::start(spec).await?;
26 // Subscribe to runtime event text.
27 let mut events = handle.subscribe_events();
28 // Build the child identifier used by operator commands.
29 let child_id = ChildId::new("market_feed");
30
31 // Send an add child command through the control handle.
32 let add = handle
33 // Add a manifest under the root supervisor.
34 .add_child(
35 // Target the root supervisor.
36 SupervisorPath::root(),
37 // Provide the child manifest text.
38 "id=market_feed kind=AsyncWorker readiness=Explicit",
39 // Provide the requesting actor.
40 "operator",
41 // Provide the audit reason.
42 "attach market feed during incident rehearsal",
43 // Finish the add child arguments.
44 )
45 // Wait for the add child command result.
46 .await?;
47 // Print the add child result.
48 print_result("add_child", add);
49
50 // Print the pause child result.
51 print_result(
52 // Label the pause result.
53 "pause_child",
54 // Send the pause child command.
55 handle
56 // Pause automatic governance.
57 .pause_child(child_id.clone(), "operator", "stop automatic restart")
58 // Wait for the pause result.
59 .await?,
60 // Finish the pause result print call.
61 );
62 // Print the resume child result.
63 print_result(
64 // Label the resume result.
65 "resume_child",
66 // Send the resume child command.
67 handle
68 // Resume lifecycle governance.
69 .resume_child(child_id.clone(), "operator", "resume lifecycle governance")
70 // Wait for the resume result.
71 .await?,
72 // Finish the resume result print call.
73 );
74 // Print the quarantine child result.
75 print_result(
76 // Label the quarantine result.
77 "quarantine_child",
78 // Send the quarantine child command.
79 handle
80 // Quarantine the child for manual investigation.
81 .quarantine_child(child_id, "operator", "manual investigation")
82 // Wait for the quarantine result.
83 .await?,
84 // Finish the quarantine result print call.
85 );
86 // Print the current state result.
87 print_result("current_state", handle.current_state().await?);
88
89 // Drain already available runtime events.
90 while let Ok(event) = events.try_recv() {
91 // Print one runtime event.
92 println!("event={event}");
93 // Finish the event drain loop.
94 }
95
96 // Print the shutdown result.
97 print_result(
98 // Label the shutdown result.
99 "shutdown_tree",
100 // Send the shutdown command.
101 handle
102 // Request tree shutdown.
103 .shutdown_tree("operator", "runtime control story complete")
104 // Wait for the shutdown result.
105 .await?,
106 // Finish the shutdown result print call.
107 );
108
109 // Finish the example successfully.
110 Ok(())
111 // End the runtime control example.
112}Sourcepub async fn shutdown_tree(
&self,
requested_by: impl Into<String>,
reason: impl Into<String>,
) -> Result<CommandResult, SupervisorError>
pub async fn shutdown_tree( &self, requested_by: impl Into<String>, reason: impl Into<String>, ) -> Result<CommandResult, SupervisorError>
Shuts down the supervisor tree idempotently.
§Arguments
requested_by: Actor that requested shutdown.reason: Human-readable shutdown reason.
§Returns
Returns the current shutdown result.
Examples found in repository?
More examples
15async fn main() -> ExampleResult {
16 // Load centralized YAML configuration.
17 let state = load_config_state("examples/config/supervisor.yaml")?;
18 // Derive the supervisor specification from configuration.
19 let spec = state.to_supervisor_spec()?;
20 // Start the supervisor runtime from the specification.
21 let handle = Supervisor::start(spec).await?;
22 // Query the current runtime state.
23 let current = handle.current_state().await?;
24 // Print the current state for the learner.
25 println!("{current:#?}");
26 // Use the runtime handle for the shutdown request.
27 handle
28 // Request tree shutdown with audit metadata.
29 .shutdown_tree("operator", "quickstart complete")
30 // Wait for the shutdown command result.
31 .await?;
32 // Finish the example successfully.
33 Ok(())
34 // End the quickstart example.
35}15async fn main() -> ExampleResult {
16 // Load centralized YAML configuration.
17 let state = load_config_state("examples/config/supervisor.yaml")?;
18 // Derive the supervisor specification from configuration.
19 let spec = state.to_supervisor_spec()?;
20 // Start the supervisor runtime from the specification.
21 let handle = Supervisor::start(spec).await?;
22 // Subscribe to runtime event text.
23 let mut events = handle.subscribe_events();
24 // Query the current runtime state.
25 let current = handle.current_state().await?;
26 // Print the current state for the learner.
27 println!("current={current:#?}");
28 // Read one emitted runtime event when it is available.
29 let received = events.recv().await;
30 // Continue only when an event was received.
31 if let Ok(event) = received {
32 // Print the observed runtime event.
33 println!("event={event:#?}");
34 // Finish the optional event display.
35 }
36 // Use the runtime handle for the shutdown request.
37 handle
38 // Request tree shutdown with audit metadata.
39 .shutdown_tree("operator", "observability probe complete")
40 // Wait for the shutdown command result.
41 .await?;
42 // Finish the example successfully.
43 Ok(())
44 // End the observability example.
45}17async fn main() -> ExampleResult {
18 // Load centralized YAML configuration.
19 let state = load_config_state("examples/config/supervisor.yaml")?;
20 // Derive the supervisor specification from configuration.
21 let spec = state.to_supervisor_spec()?;
22 // Start the supervisor runtime from the specification.
23 let handle = Supervisor::start(spec).await?;
24 // Build the visible shutdown phase list.
25 let phases = [
26 // Show the stop request phase.
27 ShutdownPhase::RequestStop,
28 // Show the graceful drain phase.
29 ShutdownPhase::GracefulDrain,
30 // Show the abort stragglers phase.
31 ShutdownPhase::AbortStragglers,
32 // Show the final reconcile phase.
33 ShutdownPhase::Reconcile,
34 // Finish the shutdown phase list.
35 ];
36 // Iterate over the visible shutdown phases.
37 for phase in phases {
38 // Print each planned phase.
39 println!("planned phase={phase:#?}");
40 // Finish the phase display loop.
41 }
42 // Use the runtime handle for the shutdown request.
43 handle
44 // Request tree shutdown with audit metadata.
45 .shutdown_tree("operator", "shutdown tree example")
46 // Wait for the shutdown command result.
47 .await?;
48 // Finish the example successfully.
49 Ok(())
50 // End the shutdown example.
51}19async fn main() -> ExampleResult {
20 // Load centralized YAML configuration.
21 let state = load_config_state("examples/config/supervisor.yaml")?;
22 // Derive the supervisor specification from configuration.
23 let spec = state.to_supervisor_spec()?;
24 // Start the supervisor runtime from the specification.
25 let handle = Supervisor::start(spec).await?;
26 // Subscribe to runtime event text.
27 let mut events = handle.subscribe_events();
28 // Build the child identifier used by operator commands.
29 let child_id = ChildId::new("market_feed");
30
31 // Send an add child command through the control handle.
32 let add = handle
33 // Add a manifest under the root supervisor.
34 .add_child(
35 // Target the root supervisor.
36 SupervisorPath::root(),
37 // Provide the child manifest text.
38 "id=market_feed kind=AsyncWorker readiness=Explicit",
39 // Provide the requesting actor.
40 "operator",
41 // Provide the audit reason.
42 "attach market feed during incident rehearsal",
43 // Finish the add child arguments.
44 )
45 // Wait for the add child command result.
46 .await?;
47 // Print the add child result.
48 print_result("add_child", add);
49
50 // Print the pause child result.
51 print_result(
52 // Label the pause result.
53 "pause_child",
54 // Send the pause child command.
55 handle
56 // Pause automatic governance.
57 .pause_child(child_id.clone(), "operator", "stop automatic restart")
58 // Wait for the pause result.
59 .await?,
60 // Finish the pause result print call.
61 );
62 // Print the resume child result.
63 print_result(
64 // Label the resume result.
65 "resume_child",
66 // Send the resume child command.
67 handle
68 // Resume lifecycle governance.
69 .resume_child(child_id.clone(), "operator", "resume lifecycle governance")
70 // Wait for the resume result.
71 .await?,
72 // Finish the resume result print call.
73 );
74 // Print the quarantine child result.
75 print_result(
76 // Label the quarantine result.
77 "quarantine_child",
78 // Send the quarantine child command.
79 handle
80 // Quarantine the child for manual investigation.
81 .quarantine_child(child_id, "operator", "manual investigation")
82 // Wait for the quarantine result.
83 .await?,
84 // Finish the quarantine result print call.
85 );
86 // Print the current state result.
87 print_result("current_state", handle.current_state().await?);
88
89 // Drain already available runtime events.
90 while let Ok(event) = events.try_recv() {
91 // Print one runtime event.
92 println!("event={event}");
93 // Finish the event drain loop.
94 }
95
96 // Print the shutdown result.
97 print_result(
98 // Label the shutdown result.
99 "shutdown_tree",
100 // Send the shutdown command.
101 handle
102 // Request tree shutdown.
103 .shutdown_tree("operator", "runtime control story complete")
104 // Wait for the shutdown result.
105 .await?,
106 // Finish the shutdown result print call.
107 );
108
109 // Finish the example successfully.
110 Ok(())
111 // End the runtime control example.
112}Sourcepub async fn current_state(&self) -> Result<CommandResult, SupervisorError>
pub async fn current_state(&self) -> Result<CommandResult, SupervisorError>
Queries the current runtime state.
§Arguments
This function has no arguments.
§Returns
Returns a CommandResult::CurrentState value.
Examples found in repository?
15async fn main() -> ExampleResult {
16 // Load centralized YAML configuration.
17 let state = load_config_state("examples/config/supervisor.yaml")?;
18 // Derive the supervisor specification from configuration.
19 let spec = state.to_supervisor_spec()?;
20 // Start the supervisor runtime from the specification.
21 let handle = Supervisor::start(spec).await?;
22 // Query the current runtime state.
23 let current = handle.current_state().await?;
24 // Print the current state for the learner.
25 println!("{current:#?}");
26 // Use the runtime handle for the shutdown request.
27 handle
28 // Request tree shutdown with audit metadata.
29 .shutdown_tree("operator", "quickstart complete")
30 // Wait for the shutdown command result.
31 .await?;
32 // Finish the example successfully.
33 Ok(())
34 // End the quickstart example.
35}More examples
15async fn main() -> ExampleResult {
16 // Load centralized YAML configuration.
17 let state = load_config_state("examples/config/supervisor.yaml")?;
18 // Derive the supervisor specification from configuration.
19 let spec = state.to_supervisor_spec()?;
20 // Start the supervisor runtime from the specification.
21 let handle = Supervisor::start(spec).await?;
22 // Subscribe to runtime event text.
23 let mut events = handle.subscribe_events();
24 // Query the current runtime state.
25 let current = handle.current_state().await?;
26 // Print the current state for the learner.
27 println!("current={current:#?}");
28 // Read one emitted runtime event when it is available.
29 let received = events.recv().await;
30 // Continue only when an event was received.
31 if let Ok(event) = received {
32 // Print the observed runtime event.
33 println!("event={event:#?}");
34 // Finish the optional event display.
35 }
36 // Use the runtime handle for the shutdown request.
37 handle
38 // Request tree shutdown with audit metadata.
39 .shutdown_tree("operator", "observability probe complete")
40 // Wait for the shutdown command result.
41 .await?;
42 // Finish the example successfully.
43 Ok(())
44 // End the observability example.
45}27pub(crate) async fn run_demo(
28 // Continue the demo expression.
29 config_path: PathBuf,
30 // Continue the demo expression.
31) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
32 // Load the full demo configuration.
33 let state = load_config_state(&config_path)?;
34 // Start the demo-owned dashboard IPC and registration runtime.
35 let demo_runtime = start_demo_dashboard_runtime(&state)?;
36 // Build a pure supervisor runtime configuration.
37 let supervisor_state = supervisor_runtime_state(state);
38 // Start the library supervisor without core demo state intrusion.
39 let handle = Supervisor::start_from_config_state(supervisor_state).await?;
40 // Query current state once to prove the runtime is live.
41 let current = handle.current_state().await?;
42 // Print the runtime state for operator inspection.
43 println!("{current:#?}");
44 // Print the demo startup summary.
45 print_startup_summary(&config_path, demo_runtime.as_ref());
46 // Wait until the operator stops the demo process.
47 tokio::signal::ctrl_c().await?;
48 // Shut down the supervisor tree before dropping resources.
49 shutdown_demo(&handle).await?;
50 // Drop the supervisor handle explicitly.
51 drop(handle);
52 // Drop the demo runtime explicitly so the IPC socket is cleaned up.
53 drop(demo_runtime);
54 // Finish the demo successfully.
55 Ok(())
56 // End demo runner.
57}19async fn main() -> ExampleResult {
20 // Load centralized YAML configuration.
21 let state = load_config_state("examples/config/supervisor.yaml")?;
22 // Derive the supervisor specification from configuration.
23 let spec = state.to_supervisor_spec()?;
24 // Start the supervisor runtime from the specification.
25 let handle = Supervisor::start(spec).await?;
26 // Subscribe to runtime event text.
27 let mut events = handle.subscribe_events();
28 // Build the child identifier used by operator commands.
29 let child_id = ChildId::new("market_feed");
30
31 // Send an add child command through the control handle.
32 let add = handle
33 // Add a manifest under the root supervisor.
34 .add_child(
35 // Target the root supervisor.
36 SupervisorPath::root(),
37 // Provide the child manifest text.
38 "id=market_feed kind=AsyncWorker readiness=Explicit",
39 // Provide the requesting actor.
40 "operator",
41 // Provide the audit reason.
42 "attach market feed during incident rehearsal",
43 // Finish the add child arguments.
44 )
45 // Wait for the add child command result.
46 .await?;
47 // Print the add child result.
48 print_result("add_child", add);
49
50 // Print the pause child result.
51 print_result(
52 // Label the pause result.
53 "pause_child",
54 // Send the pause child command.
55 handle
56 // Pause automatic governance.
57 .pause_child(child_id.clone(), "operator", "stop automatic restart")
58 // Wait for the pause result.
59 .await?,
60 // Finish the pause result print call.
61 );
62 // Print the resume child result.
63 print_result(
64 // Label the resume result.
65 "resume_child",
66 // Send the resume child command.
67 handle
68 // Resume lifecycle governance.
69 .resume_child(child_id.clone(), "operator", "resume lifecycle governance")
70 // Wait for the resume result.
71 .await?,
72 // Finish the resume result print call.
73 );
74 // Print the quarantine child result.
75 print_result(
76 // Label the quarantine result.
77 "quarantine_child",
78 // Send the quarantine child command.
79 handle
80 // Quarantine the child for manual investigation.
81 .quarantine_child(child_id, "operator", "manual investigation")
82 // Wait for the quarantine result.
83 .await?,
84 // Finish the quarantine result print call.
85 );
86 // Print the current state result.
87 print_result("current_state", handle.current_state().await?);
88
89 // Drain already available runtime events.
90 while let Ok(event) = events.try_recv() {
91 // Print one runtime event.
92 println!("event={event}");
93 // Finish the event drain loop.
94 }
95
96 // Print the shutdown result.
97 print_result(
98 // Label the shutdown result.
99 "shutdown_tree",
100 // Send the shutdown command.
101 handle
102 // Request tree shutdown.
103 .shutdown_tree("operator", "runtime control story complete")
104 // Wait for the shutdown result.
105 .await?,
106 // Finish the shutdown result print call.
107 );
108
109 // Finish the example successfully.
110 Ok(())
111 // End the runtime control example.
112}Sourcepub fn subscribe_events(&self) -> Receiver<String>
pub fn subscribe_events(&self) -> Receiver<String>
Subscribes to runtime event text emitted by the control loop.
§Arguments
This function has no arguments.
§Returns
Returns a broadcast receiver for event text.
Examples found in repository?
15async fn main() -> ExampleResult {
16 // Load centralized YAML configuration.
17 let state = load_config_state("examples/config/supervisor.yaml")?;
18 // Derive the supervisor specification from configuration.
19 let spec = state.to_supervisor_spec()?;
20 // Start the supervisor runtime from the specification.
21 let handle = Supervisor::start(spec).await?;
22 // Subscribe to runtime event text.
23 let mut events = handle.subscribe_events();
24 // Query the current runtime state.
25 let current = handle.current_state().await?;
26 // Print the current state for the learner.
27 println!("current={current:#?}");
28 // Read one emitted runtime event when it is available.
29 let received = events.recv().await;
30 // Continue only when an event was received.
31 if let Ok(event) = received {
32 // Print the observed runtime event.
33 println!("event={event:#?}");
34 // Finish the optional event display.
35 }
36 // Use the runtime handle for the shutdown request.
37 handle
38 // Request tree shutdown with audit metadata.
39 .shutdown_tree("operator", "observability probe complete")
40 // Wait for the shutdown command result.
41 .await?;
42 // Finish the example successfully.
43 Ok(())
44 // End the observability example.
45}More examples
19async fn main() -> ExampleResult {
20 // Load centralized YAML configuration.
21 let state = load_config_state("examples/config/supervisor.yaml")?;
22 // Derive the supervisor specification from configuration.
23 let spec = state.to_supervisor_spec()?;
24 // Start the supervisor runtime from the specification.
25 let handle = Supervisor::start(spec).await?;
26 // Subscribe to runtime event text.
27 let mut events = handle.subscribe_events();
28 // Build the child identifier used by operator commands.
29 let child_id = ChildId::new("market_feed");
30
31 // Send an add child command through the control handle.
32 let add = handle
33 // Add a manifest under the root supervisor.
34 .add_child(
35 // Target the root supervisor.
36 SupervisorPath::root(),
37 // Provide the child manifest text.
38 "id=market_feed kind=AsyncWorker readiness=Explicit",
39 // Provide the requesting actor.
40 "operator",
41 // Provide the audit reason.
42 "attach market feed during incident rehearsal",
43 // Finish the add child arguments.
44 )
45 // Wait for the add child command result.
46 .await?;
47 // Print the add child result.
48 print_result("add_child", add);
49
50 // Print the pause child result.
51 print_result(
52 // Label the pause result.
53 "pause_child",
54 // Send the pause child command.
55 handle
56 // Pause automatic governance.
57 .pause_child(child_id.clone(), "operator", "stop automatic restart")
58 // Wait for the pause result.
59 .await?,
60 // Finish the pause result print call.
61 );
62 // Print the resume child result.
63 print_result(
64 // Label the resume result.
65 "resume_child",
66 // Send the resume child command.
67 handle
68 // Resume lifecycle governance.
69 .resume_child(child_id.clone(), "operator", "resume lifecycle governance")
70 // Wait for the resume result.
71 .await?,
72 // Finish the resume result print call.
73 );
74 // Print the quarantine child result.
75 print_result(
76 // Label the quarantine result.
77 "quarantine_child",
78 // Send the quarantine child command.
79 handle
80 // Quarantine the child for manual investigation.
81 .quarantine_child(child_id, "operator", "manual investigation")
82 // Wait for the quarantine result.
83 .await?,
84 // Finish the quarantine result print call.
85 );
86 // Print the current state result.
87 print_result("current_state", handle.current_state().await?);
88
89 // Drain already available runtime events.
90 while let Ok(event) = events.try_recv() {
91 // Print one runtime event.
92 println!("event={event}");
93 // Finish the event drain loop.
94 }
95
96 // Print the shutdown result.
97 print_result(
98 // Label the shutdown result.
99 "shutdown_tree",
100 // Send the shutdown command.
101 handle
102 // Request tree shutdown.
103 .shutdown_tree("operator", "runtime control story complete")
104 // Wait for the shutdown result.
105 .await?,
106 // Finish the shutdown result print call.
107 );
108
109 // Finish the example successfully.
110 Ok(())
111 // End the runtime control example.
112}Trait Implementations§
Source§impl Clone for SupervisorHandle
impl Clone for SupervisorHandle
Source§fn clone(&self) -> SupervisorHandle
fn clone(&self) -> SupervisorHandle
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for SupervisorHandle
impl !RefUnwindSafe for SupervisorHandle
impl Send for SupervisorHandle
impl Sync for SupervisorHandle
impl Unpin for SupervisorHandle
impl UnsafeUnpin for SupervisorHandle
impl !UnwindSafe for SupervisorHandle
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);