Skip to main content

SystemChart

Struct SystemChart 

Source
pub struct SystemChart {
    pub title: String,
    pub state: SysChartModel,
}
Expand description

The system-map chart Facet: a tab title plus the complete observable SysChartModel. The FC-9 pure view reads it and the FC-2 update is the sole path that mutates it.

Fields§

§title: String

Tab/panel title.

§state: SysChartModel

All observable state (FC-3).

Implementations§

Source§

impl SystemChart

Source

pub const NODE_R: f32 = NODE_R

The node radius (px) the free-position layout pads the canvas by, exposed so the matrix can assert nodes land inside rect by exactly this inset.

Source

pub fn new( title: impl Into<String>, nodes: Vec<SysNode>, edges: Vec<SysEdge>, ) -> Self

Source

pub fn with_canvas_height(self, h: f32) -> Self

Source

pub fn from_layers( title: impl Into<String>, layers: Vec<Vec<SysNode>>, edges: Vec<SysEdge>, ) -> Self

Build a layered system map — the architecture/topology “grouped by layer” shape. layers are top-to-bottom bands (e.g. ingress → services → storage); each band’s nodes are spread evenly across the width and pinned to that band’s vertical position, so the map reads as a constellation diagram organised by layer. Node pos fields are overwritten by the layout; edges (the dependencies) are added as given. This is SystemChart::new with the free positions computed from the layering instead of supplied.

Source

pub fn demo() -> Self

A self-contained demo constellation map — a small nordisk architecture in three layers (ingress gateway → the korp/nornir/holger services → the skade/iceberg storage), with dependency edges and per-service badges. The fixture the syschart_panel demo (and the Pages site) mounts.

Source

pub fn nodes(&self) -> &[SysNode]

The nodes (read-only view of the model).

Source

pub fn edges(&self) -> &[SysEdge]

The edges (read-only view of the model).

Source

pub fn update(&mut self, msg: Msg) -> Vec<Effect>

FC-2 / FC-8 — the single mutation path. Apply one Msg; returns the (always empty) Effects the host should run. The canvas click routes its Msg here too, so live == headless.

Source

pub fn select(&mut self, id: &str)

Select a node by id (headless-test + host entry point). Selecting the already-selected node deselects it. Unknown id is a no-op. Thin wrapper over update(Msg::Select) — the single mutation path.

Source

pub fn clear_selection(&mut self)

Clear the selection (Msg::ClearSelection).

Source

pub fn selected(&self) -> Option<&str>

The selected node’s id, if any.

Source

pub fn set_badge(&mut self, id: &str, badge: u64)

Update a node’s badge by id (e.g. a live event count). No-op if unknown. Thin wrapper over update(Msg::SetBadge).

Source

pub fn set_detail(&mut self, id: &str, detail: impl Into<String>)

Update a node’s detail text by id. No-op if unknown. Thin wrapper over update(Msg::SetDetail).

Source

pub fn node_center(&self, i: usize, rect: Rect) -> Pos2

Test/host hook (additive). The public, return-asserted view of the private center layout node — the absolute pixel centre node i’s circle is painted at inside rect. Exposed so the syschart call-chain matrix can assert the layout/place stage (finite, confined to the padded inner rect, monotone in the normalized pos) without a painter. Calls the same private fn view paints with — additive, no behaviour change. The node radius the layout pads for is SystemChart::NODE_R.

Source§

impl SystemChart

Source

pub fn copy_text(&self) -> Option<String>

The copyable text: the selected node’s label · detail (badge in a suffix) when a node is selected, else the whole node list as a TSV rectangle (id \t label \t badge).

Source

pub fn view(&self, ui: &mut Ui) -> Vec<Msg>

FC-9 pure view — a function of &self: it paints the chart and returns the Msgs the frame produced (a node click → Msg::Select). It does not mutate the model; the impl_facet_via_elm! bridge applies the returned messages through update, so a headless driver feeding the same Msgs reproduces the live behaviour.

Trait Implementations§

Source§

impl CopySource for SystemChart

Source§

fn copy_kinds(&self) -> &[ClipKind]

The kinds this source can offer, richest first.
Source§

fn copy_payload(&self) -> Option<ClipPayload>

Produce the payload for the current selection (richest representation).
Source§

impl Elm for SystemChart

Source§

type Model = SysChartModel

All observable state, in one serializable struct (FC-1 / FC-3).
Source§

type Msg = Msg

Every input the component accepts (FC-2). The only legal way to mutate the Model.
Source§

type Effect = Effect

Side work as data (FC-8). Use enum Effect {} when the component does no I/O.
Source§

fn title(&self) -> &str

The deck keys facets off this (mirrors Facet::title).
Source§

fn state(&self) -> &SysChartModel

FC-3 — read the complete observable state at any frame boundary.
Source§

fn update(&mut self, msg: Msg) -> Vec<Effect>

FC-2 / FC-8 — the single mutation path. Apply one Msg; return the Effects the host should run (empty = nothing to do).
Source§

fn view(&self, ui: &mut Ui) -> Vec<Msg>

FC-9 / FC-4 — a pure function of &self: it paints and returns the Msgs it produced. It MUST NOT mutate the model or do I/O; the Facet::ui bridge applies the returned messages through update.
Source§

impl Facet for SystemChart

Source§

fn component(&self) -> &'static str

The pane’s DEV-ID, derived with zero per-pane code: module_path!() expands at the CALL site, so a bridged pane in facett-geomap reports facett_geomap, which devid::normalize maps to the registry component geomap. Override in the extras block to say something else.

Source§

fn ui(&mut self, ui: &mut Ui)

FC-9: the view is pure (paints + emits Msgs); FC-2: mutation only via update. The immediate-mode trait just bridges the two.

Source§

fn severity(&self) -> Severity

STRUCTURAL severity (the Robot-UI gate signal): RED when the chart has no peers to show (the facet-syschart-1 empty state), the Info floor otherwise.

Source§

fn caps(&self) -> FacetCaps

Painted with the active Theme (nodes/edges/text/accent ring), and its canvas takes the host’s available width — themeable + resizable.

Source§

fn as_any_mut(&mut self) -> Option<&mut dyn Any>

Opt into typed downcast so a host (e.g. the demo’s robot-UI node-select toolbar) can forward a selection to SystemChart::select when this chart lives boxed inside a FacetDeck.

Source§

fn title(&self) -> &str

Source§

fn copy(&mut self) -> Option<String>

Clipboard hooks — see clipboard.rs. Defaults: nothing to give/take. Returns the text to place on the clipboard (None = nothing copyable now).
Source§

fn state_json(&self) -> Value

Source§

fn selection_json(&self) -> Value

The current selection as JSON (also folded into state_json by convention). Null when nothing/none selectable.
Source§

fn update_json(&mut self, _msg_json: &str)

The Elm mutation path — apply one message (JSON). This is the fourth member of the component contract (title/ui/state_json/update_json), and it is defaulted to a no-op so it is purely ADDITIVE: every existing impl Facet keeps compiling unchanged, while a facet that wants the writable input surface overrides it (an Elm-backed facet routes the JSON through its update). With this default in place Facet and Panel share the same four-method shape, which is what lets the blanket impl<T: Facet> Panel for T (see panel) make every Facet a Panel for free. Unknown/undriven messages are ignored — the default simply does nothing.
Source§

fn scale(&self) -> f32

Current uniform scale (1.0 = native). Override if caps().scalable.
Source§

fn set_scale(&mut self, _scale: f32)

Set the uniform scale; clamp internally. Default no-op (not scalable).
Source§

fn scale_range(&self) -> (f32, f32)

The band [min, max], relative to native (1.0), that this facet’s uniform scale may be driven over. FacetDeck::scale_active clamps into it. Read more
Source§

fn cut(&mut self) -> Option<String>

Like copy, but also removes the selection. Default delegates to copy.
Source§

fn paste(&mut self, _text: &str) -> bool

Accept pasted text. Returns true if consumed.
Source§

fn kind(&self) -> &'static str

Stable component-type id (e.g. "jobview", "graphpan", "table"). Two instances with the same kind can exchange portable state; the empty default "" means opted out of cross-instance clone.
Source§

fn portable_state(&self) -> Option<Value>

The portable subset of this facet’s state — the fields a same-kind sibling can adopt. None = not cloneable. Kept SEPARATE from state_json (the introspection dump, which may carry derived / render-only data) so this stays round-trippable through load_state.
Source§

fn load_state(&mut self, _state: &Value) -> bool

Adopt a portable state produced by portable_state on a same-kind sibling. Returns true if accepted. Default false (opt-in per component).

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

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
Source§

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

Source§

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

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Panel for T
where T: Facet + ?Sized,

Source§

fn title(&self) -> &str

Tab label / panel heading.
Source§

fn ui(&mut self, ui: &mut Ui)

Paint into the live egui frame. Backends: native paints directly; the native cross-host adapter forwards to the guest pane’s own ui; the wasm backend paints a decoded display-list; headless paints nothing.
Source§

fn state_json(&self) -> Value

FC-3 observable state — the common currency for tests + the web state-hook.
Source§

fn update_json(&mut self, msg_json: &str)

The Elm mutation path — apply one message (JSON). Used by the headless drive + robotui, and by the wasm/adapter backends to route host-side input.
Source§

fn severity(&self) -> Severity

The pane’s STRUCTURAL severity — the RESOLVED Robot-UI error signal that the headless robot reads through this seam (decision (a)). Mirrors Facet::severity; the blanket impl below forwards to it. Defaulted to [Severity::Info](crate::Severity::Info) so it is purely ADDITIVE — no existing Panel backend has to change. The Robot-UI HARD GATE fails on any driven pane that returns Severity::Error.
Source§

fn component(&self) -> &'static str

The pane’s stable DEV-ID — mirrors Facet::component; the blanket impl below forwards to it. Defaulted to "" so it is purely ADDITIVE — no existing Panel backend has to change.
Source§

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

Source§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

Source§

fn simd_from(_simd: S, value: T) -> T

Source§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

Source§

fn simd_from(value: T, _simd: S) -> T

Source§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

Source§

fn simd_into(self, simd: S) -> T

Source§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

Source§

fn simd_into(self, simd: S) -> T

Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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.