pub struct ConfigState {
pub supervisor: SupervisorRootConfig,
pub policy: PolicyConfig,
pub shutdown: ShutdownConfig,
pub observability: ObservabilityConfig,
pub ipc: Option<DashboardIpcConfig>,
}Expand description
Immutable validated configuration state.
Fields§
§supervisor: SupervisorRootConfigRoot supervisor declaration values.
policy: PolicyConfigRuntime policy values.
shutdown: ShutdownConfigShutdown budget values.
observability: ObservabilityConfigObservability switches and capacities.
ipc: Option<DashboardIpcConfig>Optional target-side dashboard IPC configuration.
Implementations§
Source§impl ConfigState
impl ConfigState
Sourcepub fn to_supervisor_spec(&self) -> Result<SupervisorSpec, SupervisorError>
pub fn to_supervisor_spec(&self) -> Result<SupervisorSpec, SupervisorError>
Converts validated configuration into a supervisor declaration.
§Arguments
This function has no arguments.
§Returns
Returns a crate::spec::supervisor::SupervisorSpec derived from the
validated YAML configuration.
§Examples
let yaml = r#"
supervisor:
strategy: OneForAll
policy:
child_restart_limit: 10
child_restart_window_ms: 60000
supervisor_failure_limit: 30
supervisor_failure_window_ms: 60000
initial_backoff_ms: 10
max_backoff_ms: 1000
jitter_ratio: 0.0
heartbeat_interval_ms: 1000
stale_after_ms: 3000
shutdown:
graceful_timeout_ms: 1000
abort_wait_ms: 100
observability:
event_journal_capacity: 64
metrics_enabled: true
audit_enabled: true
"#;
let state = rust_supervisor::config::yaml::parse_config_state(yaml).unwrap();
let spec = state.to_supervisor_spec().unwrap();
assert_eq!(spec.strategy, rust_supervisor::spec::supervisor::SupervisionStrategy::OneForAll);
assert_eq!(spec.supervisor_failure_limit, 30);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}Trait Implementations§
Source§impl Clone for ConfigState
impl Clone for ConfigState
Source§fn clone(&self) -> ConfigState
fn clone(&self) -> ConfigState
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ConfigState
impl Debug for ConfigState
Source§impl<'de> Deserialize<'de> for ConfigState
impl<'de> Deserialize<'de> for ConfigState
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl PartialEq for ConfigState
impl PartialEq for ConfigState
Source§fn eq(&self, other: &ConfigState) -> bool
fn eq(&self, other: &ConfigState) -> bool
self and other values to be equal, and is used by ==.Source§impl Serialize for ConfigState
impl Serialize for ConfigState
Source§impl TryFrom<SupervisorConfig> for ConfigState
impl TryFrom<SupervisorConfig> for ConfigState
Source§fn try_from(config: SupervisorConfig) -> Result<Self, Self::Error>
fn try_from(config: SupervisorConfig) -> Result<Self, Self::Error>
Converts a deserialized supervisor config into validated state.
Source§type Error = SupervisorError
type Error = SupervisorError
impl StructuralPartialEq for ConfigState
Auto Trait Implementations§
impl Freeze for ConfigState
impl RefUnwindSafe for ConfigState
impl Send for ConfigState
impl Sync for ConfigState
impl Unpin for ConfigState
impl UnsafeUnpin for ConfigState
impl UnwindSafe for ConfigState
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);