Skip to main content

RuntimeState

Struct RuntimeState 

Source
pub struct RuntimeState {
    pub nodes: BTreeMap<String, NodeState>,
}
Expand description

What is true of a node in a running process, and of nothing on a published page.

A graph is definitions: they are the same in a static build and in a server, and they are what compose derives. This is the overlay a consumer with a process to ask lays over them, keyed by node id. It is deliberately not a field of Node: a node that could carry runtime state would carry it into the static projection, where it would be a value nobody can refresh and a reader cannot distinguish from a current one.

Fields§

§nodes: BTreeMap<String, NodeState>

Node id to what the process says about it now.

Implementations§

Source§

impl RuntimeState

Source

pub fn narrowed_to(&self, graph: &Graph) -> RuntimeState

The observations that name a node of this graph, and no others.

An observing process knows about subsystems, not about one graph’s vocabulary, so what it offers is wider than what any graph can show. Narrowing here rather than at each consumer is what keeps the overlay keyed by node id: an entry that survives names a node, and a renderer can look every key up.

use majordomus_cli::graph::{Builder, Node, NodeState, RuntimeState};
let mut b = Builder::new("g", "G", "one node", "the composed registry")
    .node_kind("module", "a subsystem");
b.node(Node {
    id: "module:mesh".into(), kind: "module".into(), label: "mesh".into(),
    summary: None, route: None, source: None, status: None, external: false,
    facts: Default::default(),
});
let graph = b.finish();

let mut observed = RuntimeState::default();
for id in ["module:mesh", "module:not-in-this-graph"] {
    observed.nodes.insert(id.into(), NodeState { status: "ok".into(), detail: None });
}

let overlay = observed.narrowed_to(&graph);
assert_eq!(overlay.nodes.keys().map(String::as_str).collect::<Vec<_>>(), ["module:mesh"]);
Source

pub fn of(&self, node_id: &str) -> Option<&NodeState>

What the process says about one node now, if anything.

None is the ordinary answer, not a failure: a graph names more than any one process observes, so a renderer draws the declared status alone for those nodes.

use majordomus_cli::graph::{NodeState, RuntimeState};
let mut observed = RuntimeState::default();
observed.nodes.insert(
    "module:mesh".into(),
    NodeState { status: "ready".into(), detail: Some("2 peers".into()) },
);

assert_eq!(observed.of("module:mesh").map(|s| s.status.as_str()), Some("ready"));
assert!(observed.of("module:nothing-observed-it").is_none());

Trait Implementations§

Source§

impl Clone for RuntimeState

Source§

fn clone(&self) -> RuntimeState

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for RuntimeState

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for RuntimeState

Source§

fn default() -> RuntimeState

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for RuntimeState

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Eq for RuntimeState

Source§

impl JsonSchema for RuntimeState

Source§

fn schema_name() -> Cow<'static, str>

The name of the generated JSON Schema. Read more
Source§

fn schema_id() -> Cow<'static, str>

Returns a string that uniquely identifies the schema produced by this type. Read more
Source§

fn json_schema(generator: &mut SchemaGenerator) -> Schema

Generates a JSON Schema for this type. Read more
Source§

fn inline_schema() -> bool

Whether JSON Schemas generated for this type should be included directly in parent schemas, rather than being re-used where possible using the $ref keyword. Read more
Source§

impl PartialEq for RuntimeState

Source§

fn eq(&self, other: &RuntimeState) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for RuntimeState

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for RuntimeState

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more