Skip to main content

Engine

Struct Engine 

Source
pub struct Engine { /* private fields */ }
Expand description

The main Hypen engine that orchestrates reactive UI rendering.

§Architecture: Shared Engine, Namespaced State

Multi-module applications share a single Engine instance. Each module registers its state under a lowercase-name prefix (e.g., search) so the engine holds one merged state tree. The SDK layer (HypenModuleInstance in TypeScript, ModuleInstance in Kotlin/Swift/Go) manages module lifecycles, action routing, and cross-module communication – the engine itself only sees a flat JSON state and resolves @{state.xxx} bindings against it.

§Multi-module Applications

  1. One shared engine – all modules register their namespaced state into it. There is NOT one engine per module.

  2. SDK-managed module instances – each SDK maintains multiple module instances (e.g., HypenModuleInstance in TypeScript), each with its own state tracking (Proxy in TS, ObservableState in Kotlin/Swift/Go).

  3. Cross-module communication uses HypenGlobalContext:

    // In Search's action handler:
    const app = context.getModule<AppState>("App");
    const currentView = app.getState().currentView;
    app.setState({ showSearch: true });
  4. State binding scope: Each module’s template binds to its own state via the namespace prefix. Cross-module data flows through the global context, keeping each module’s reactive graph self-contained.

§Design Rationale

Keeping one shared engine avoids duplicating the parser, reconciler, and dependency graph per module. Namespaced state keys ensure modules don’t shadow each other’s fields while the engine’s path-based dependency tracker naturally scopes re-renders to only the affected module’s bindings.

Implementations§

Source§

impl Engine

Source

pub fn new() -> Self

Source

pub fn register_component(&mut self, component: Component)

Register a custom component

Source

pub fn set_component_resolver<F>(&mut self, resolver: F)
where F: Fn(&str, Option<&str>) -> Option<ResolvedComponent> + Send + Sync + 'static,

Set the component resolver for dynamic component loading The resolver receives (component_name, context_path) and should return ResolvedComponent { source, path } or None

Source

pub fn register_resource(&mut self, name: &str, svg: &str)

Register a single resource from raw SVG content.

Source

pub fn register_resources(&mut self, map: IndexMap<String, String>)

Register multiple resources from a name -> SVG map.

Source

pub fn resource_registry(&self) -> &ResourceRegistry

Get access to the resource registry

Source

pub fn resource_registry_mut(&mut self) -> &mut ResourceRegistry

Get mutable access to the resource registry

Source

pub fn icon_registry(&self) -> &ResourceRegistry

Backwards-compatible alias

Source

pub fn icon_registry_mut(&mut self) -> &mut ResourceRegistry

Backwards-compatible alias

Source

pub fn set_module(&mut self, module: ModuleInstance)

Set the primary module instance (backward-compatible single-module API).

Source

pub fn register_module( &mut self, name: impl Into<String>, module: ModuleInstance, )

Register a named module for multi-module apps.

The engine scopes @{state.xxx} bindings to this module’s state when rendering a component whose source starts with module <name> { ... }. The name should be lowercase (e.g., "search").

Also registers the module’s declared actions in the action->module map so that update_state after dispatch_action automatically routes to the correct module.

Source

pub fn get_module_state(&self, name: &str) -> Option<&Value>

Get a named module’s state (for reconciler lookups).

Source

pub fn modules(&self) -> &IndexMap<String, ModuleInstance>

Get access to all registered modules (for reconciler).

Source

pub fn set_render_callback<F>(&mut self, callback: F)
where F: Fn(&[Patch]) + Send + Sync + 'static,

Set the render callback

Source

pub fn on_action<F>(&mut self, action_name: impl Into<String>, handler: F)
where F: Fn(&Action) + Send + Sync + 'static,

Register an action handler

Source

pub fn render(&mut self, element: &Element)

Render an element tree (initial render or full re-render).

This accepts a flat Element. For sources that use ForEach, When, or If, prefer [render_ir_node] which preserves first-class control flow.

Source

pub fn render_ir_node(&mut self, ir_node: &IRNode)

Render an IRNode tree (initial render or full re-render).

Unlike [render], this accepts an IRNode (from ast_to_ir_node()), which preserves ForEach, When, and If as first-class control-flow nodes. This is the same path used by the WASM engine.

Source

pub fn notify_state_change(&mut self, change: &StateChange)

Handle a state change notification from a host that keeps its own state.

Use this when the host already mutated its own state copy and just wants the engine to invalidate and re-render the affected nodes. Engine-owned state should go through [update_state] / [update_state_sparse] instead.

Uses a revision guard: if the primary module’s state hasn’t changed since the last render, this skips the redundant render. This catches SDK Proxy microtasks re-firing after an explicit update_state already processed the same change.

Source

pub fn update_state(&mut self, scope: Option<&str>, state_patch: Value)

Apply a state patch and re-render affected nodes.

scope selects the target module:

  • None → primary module set via set_module
  • Some(name) → named module registered via [register_module]

Skips rendering if the patch produces no actual state change.

Source

pub fn update_state_sparse( &mut self, scope: Option<&str>, paths: &[String], values: &Value, )

Apply a sparse state patch (path-value pairs) and re-render affected nodes. See [update_state] for scope semantics.

Source

pub fn dispatch_action(&mut self, action: Action) -> Result<(), EngineError>

Dispatch an action to its registered handler.

Source

pub fn action_scope_for(&self, action_name: &str) -> Option<String>

Look up which named module (by lowercased name) owns a given action.

Returns Some(name) when the action was registered via [register_module]. Returns None for both “primary-module actions” (declared on the module set via [set_module]) and “unknown actions” — in both cases callers should route follow-up update_state calls to the primary slot (scope None), which is the correct default.

Callers that host action handlers outside the engine (e.g., the Rust SDK’s RemoteSession) can use this to route an incoming dispatch to the correct module’s state without having to call dispatch_action.

Source

pub fn revision(&self) -> u64

Get the current revision number

Source

pub fn component_registry(&self) -> &ComponentRegistry

Get access to the component registry

Source

pub fn component_registry_mut(&mut self) -> &mut ComponentRegistry

Get mutable access to the component registry

Source

pub fn resources(&self) -> &ResourceCache

Get access to the resource cache

Source

pub fn resources_mut(&mut self) -> &mut ResourceCache

Get mutable access to the resource cache

Source

pub fn set_context(&mut self, name: &str, data: Value)

Set (or replace) a named data source context.

Registers the provider in the dependency graph (if not already known), stores the data, and re-renders every node bound to @name.*. This is the single entry point for all data source writes – sparse merging (if needed) should happen at the SDK layer before calling this method with the merged object.

§Example
engine.set_context("spacetime", json!({
    "message": [{ "id": 1, "text": "Hello" }],
    "user": [{ "id": 1, "name": "Alice" }]
}));
Source

pub fn remove_context(&mut self, name: &str)

Remove a data source context entirely.

Drops the provider’s state and re-renders bound nodes (they resolve to null).

Source

pub fn data_sources(&self) -> &IndexMap<String, Value>

Get read access to the data sources map.

Trait Implementations§

Source§

impl Default for Engine

Source§

fn default() -> Self

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

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

impl<T> Erasable for T

Source§

const ACK_1_1_0: bool = true

Whether this implementor has acknowledged the 1.1.0 update to unerase’s documented implementation requirements. Read more
Source§

unsafe fn unerase(this: NonNull<Erased>) -> NonNull<T>

Unerase this erased pointer. Read more
Source§

fn erase(this: NonNull<Self>) -> NonNull<Erased>

Turn this erasable pointer into an erased pointer. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

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

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

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.

Source§

impl<'src, T> IntoMaybe<'src, T> for T
where T: 'src,

Source§

type Proj<U: 'src> = U

Source§

fn map_maybe<R>( self, _f: impl FnOnce(&'src T) -> &'src R, g: impl FnOnce(T) -> R, ) -> <T as IntoMaybe<'src, T>>::Proj<R>
where R: 'src,

Source§

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

Source§

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 primary(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Primary].

§Example
println!("{}", value.primary());
Source§

fn fixed(&self, color: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Fixed].

§Example
println!("{}", value.fixed(color));
Source§

fn rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Rgb].

§Example
println!("{}", value.rgb(r, g, b));
Source§

fn black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Black].

§Example
println!("{}", value.black());
Source§

fn red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Red].

§Example
println!("{}", value.red());
Source§

fn green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Green].

§Example
println!("{}", value.green());
Source§

fn yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Yellow].

§Example
println!("{}", value.yellow());
Source§

fn blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Blue].

§Example
println!("{}", value.blue());
Source§

fn magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Magenta].

§Example
println!("{}", value.magenta());
Source§

fn cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Cyan].

§Example
println!("{}", value.cyan());
Source§

fn white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: White].

§Example
println!("{}", value.white());
Source§

fn bright_black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlack].

§Example
println!("{}", value.bright_black());
Source§

fn bright_red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightRed].

§Example
println!("{}", value.bright_red());
Source§

fn bright_green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightGreen].

§Example
println!("{}", value.bright_green());
Source§

fn bright_yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightYellow].

§Example
println!("{}", value.bright_yellow());
Source§

fn bright_blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlue].

§Example
println!("{}", value.bright_blue());
Source§

fn bright_magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.bright_magenta());
Source§

fn bright_cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightCyan].

§Example
println!("{}", value.bright_cyan());
Source§

fn bright_white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightWhite].

§Example
println!("{}", value.bright_white());
Source§

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>

Returns self with the bg() set to [Color :: Primary].

§Example
println!("{}", value.on_primary());
Source§

fn on_fixed(&self, color: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Fixed].

§Example
println!("{}", value.on_fixed(color));
Source§

fn on_rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Rgb].

§Example
println!("{}", value.on_rgb(r, g, b));
Source§

fn on_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Black].

§Example
println!("{}", value.on_black());
Source§

fn on_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Red].

§Example
println!("{}", value.on_red());
Source§

fn on_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Green].

§Example
println!("{}", value.on_green());
Source§

fn on_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Yellow].

§Example
println!("{}", value.on_yellow());
Source§

fn on_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Blue].

§Example
println!("{}", value.on_blue());
Source§

fn on_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Magenta].

§Example
println!("{}", value.on_magenta());
Source§

fn on_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Cyan].

§Example
println!("{}", value.on_cyan());
Source§

fn on_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: White].

§Example
println!("{}", value.on_white());
Source§

fn on_bright_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlack].

§Example
println!("{}", value.on_bright_black());
Source§

fn on_bright_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightRed].

§Example
println!("{}", value.on_bright_red());
Source§

fn on_bright_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightGreen].

§Example
println!("{}", value.on_bright_green());
Source§

fn on_bright_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightYellow].

§Example
println!("{}", value.on_bright_yellow());
Source§

fn on_bright_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlue].

§Example
println!("{}", value.on_bright_blue());
Source§

fn on_bright_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.on_bright_magenta());
Source§

fn on_bright_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightCyan].

§Example
println!("{}", value.on_bright_cyan());
Source§

fn on_bright_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightWhite].

§Example
println!("{}", value.on_bright_white());
Source§

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 bold(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Bold].

§Example
println!("{}", value.bold());
Source§

fn dim(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Dim].

§Example
println!("{}", value.dim());
Source§

fn italic(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Italic].

§Example
println!("{}", value.italic());
Source§

fn underline(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Underline].

§Example
println!("{}", value.underline());

Returns self with the attr() set to [Attribute :: Blink].

§Example
println!("{}", value.blink());

Returns self with the attr() set to [Attribute :: RapidBlink].

§Example
println!("{}", value.rapid_blink());
Source§

fn invert(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Invert].

§Example
println!("{}", value.invert());
Source§

fn conceal(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Conceal].

§Example
println!("{}", value.conceal());
Source§

fn strike(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Strike].

§Example
println!("{}", value.strike());
Source§

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 mask(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Mask].

§Example
println!("{}", value.mask());
Source§

fn wrap(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Wrap].

§Example
println!("{}", value.wrap());
Source§

fn linger(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Linger].

§Example
println!("{}", value.linger());
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.

Returns self with the quirk() set to [Quirk :: Clear].

§Example
println!("{}", value.clear());
Source§

fn resetting(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Resetting].

§Example
println!("{}", value.resetting());
Source§

fn bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Bright].

§Example
println!("{}", value.bright());
Source§

fn on_bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: OnBright].

§Example
println!("{}", value.on_bright());
Source§

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

fn new(self) -> Painted<Self>
where Self: Sized,

Create a new Painted with a default Style. Read more
Source§

fn paint<S>(&self, style: S) -> Painted<&Self>
where S: Into<Style>,

Apply a style wholesale to self. Any previous style is replaced. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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.
Source§

impl<T> WithSubscriber for T

Source§

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

fn with_current_subscriber(self) -> WithDispatch<Self>

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