Skip to main content

Router

Struct Router 

Source
pub struct Router<State>
where State: 'static,
{ /* private fields */ }
Expand description

The declarative router vocabulary (a go_router-subset layer), flat-re-exported from frust-widgets so app code never names that crate directly: Router resolves a location against a Route table (built via RouteBuilder) into Resolution/ResolvedPages driving a NavigatorController, with :param/query parsing (Location/PathPattern/RouteParams), per-route/top-level Redirects (loop-guarded at DEFAULT_REDIRECT_LIMIT), and an ErrorBuilder fallback for an unmatched location.

A page builder receives the location’s query merged under its path captures, so /terminal?session=abc reads its own parameter.

RouteNavigator is the seam a screen navigates through: a Send + Sync queue of NavRequest data (paths and names, never closures) that rides provide_context — the Router itself cannot, since it holds Rc page builders. RouterDeepLinks::track drains it every rebuild, so a request queued in an event handler (on any thread — the queue never panics off-thread) applies on the next frame.

shell_route is the nested-navigator binding: its children resolve onto a second NavigatorController the app owns and its own page — the chrome wrapping that inner navigator — stays retained while they do, so navigating between siblings inside the shell never rebuilds the chrome. See its docs for the keep rule and the per-verb table. A declarative router over a navigator. See the module docs.

Implementations§

Source§

impl<State> Router<State>
where State: 'static,

Source

pub fn new(routes: Vec<Route<State>>) -> Router<State>

A router over routes with a fresh NavigatorController, the default error page, and the default redirect limit (DEFAULT_REDIRECT_LIMIT).

Source

pub fn with_controller( controller: &NavigatorController<State>, routes: Vec<Route<State>>, ) -> Router<State>

A router driving controller (so an app can hand the same controller to navigator).

Source

pub fn redirect( self, redirect: impl Fn(&Location) -> Option<String> + 'static, ) -> Router<State>

Set a top-level redirect, consulted before matching on every resolution.

Source

pub fn error_builder( self, error_builder: impl Fn(&Location) -> AnyView<State> + 'static, ) -> Router<State>

Replace the error-page builder (default: a simple themed “not found” page).

Source

pub fn redirect_limit(self, limit: usize) -> Router<State>

Override the redirect loop limit (default DEFAULT_REDIRECT_LIMIT).

Source

pub fn controller(&self) -> &NavigatorController<State>

The controller this router drives — hand it to navigator so the app’s page stack and the router share one op queue.

Source

pub fn resolve(&self, raw: &str) -> Resolution<State>

Resolve a location string into a Resolution (pure; no controller side effects). Applies top-level and per-route redirects under the loop guard; an unmatched location or an over-limit redirect chain yields Resolution::Error.

Source

pub fn route_navigator(&self) -> RouteNavigator

The RouteNavigator screens navigate through: a Send + Sync handle safe to hold under provide_context, in a callback, or on a background thread. Requests queued on it are applied by this router’s next pump — see the module docs’ “Reaching the router from a screen”.

Source

pub fn pump(&self)

Drain the route_navigator’s queue and apply each request, in order. Idempotent when the queue is empty, so it is meant to be called unconditionally once per rebuild (the facade’s RouterDeepLinks::track does exactly that). Must run on the UI thread — it drives the Rc-backed NavigatorController; queuing is what is thread-free.

Source

pub fn go(&self, location: &str)

Reset the stack to the matched chain (replace semantics — the current top’s state is dropped). See the module docs’s deferred note on arbitrary-depth reset.

Each resolved page is stamped with its own ResolvedPage::location (R-B1) — NavigatorController::route_stack tracks the resulting page-to-route mapping, so no consumer needs to re-derive it.

A chain crossing a shell_route boundary is split across the two controllers instead, under the keep rule — see shell_route’s table.

Source

pub fn push(&self, location: &str)

Push the matched leaf page onto the stack (the page below is retained).

Stamps the leaf’s ResolvedPage::location — see go’s doc. Across a shell_route boundary the leaf lands on the shell’s inner controller — see shell_route’s table.

Source

pub fn replace(&self, location: &str)

Replace the top page with the matched leaf (the top’s state is dropped; the stack depth is unchanged). go’s single-page case, minus the chain push — the op a NavRequest::Replace applies.

Stamps the leaf’s ResolvedPage::location — see go’s doc. Across a shell_route boundary the replaced top is the shell’s inner one — see shell_route’s table.

Source

pub fn pop(&self)

Pop the top page of the router’s own controller (a no-op on the root page — see NavigatorController::pop).

Deliberately not shell-aware: popping “one page, wherever the user actually is” is back arbitration’s job (the facade’s back handler routes a press innermost-first), not the router’s. See the module docs’ deferred note and shell_route’s Back section.

Source

pub fn handle_location(&self, location: &str)

The single entry point a deep link resolves through — same reset semantics as go. The facade tracks the deep-link signal and calls this; this crate stays reactive-free.

Source

pub fn go_named(&self, name: &str, params: &BTreeMap<String, String>)

Resolve name + params into a path, then go to it. An unknown name routes to the error page.

Source

pub fn push_named(&self, name: &str, params: &BTreeMap<String, String>)

Resolve name + params into a path, then push it. An unknown name routes to the error page.

Source

pub fn path_for_name( &self, name: &str, params: &BTreeMap<String, String>, ) -> Option<String>

Build the full path for a named route, substituting :params from params (composing nested parent + child patterns). Params not consumed by a path segment become query parameters (go_router parity). None if no route has the name.

Auto Trait Implementations§

§

impl<State> !Freeze for Router<State>

§

impl<State> !RefUnwindSafe for Router<State>

§

impl<State> !Send for Router<State>

§

impl<State> !Sync for Router<State>

§

impl<State> !UnwindSafe for Router<State>

§

impl<State> Unpin for Router<State>
where Vec<Route<State>>: Unpin, NavigatorController<State>: Unpin, Rc<dyn Fn(&Location) -> AnyView<State>>: Unpin,

§

impl<State> UnsafeUnpin for Router<State>
where Vec<Route<State>>: UnsafeUnpin, NavigatorController<State>: UnsafeUnpin, Rc<dyn Fn(&Location) -> AnyView<State>>: UnsafeUnpin,

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<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> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> ErasedDestructor for T
where T: 'static,

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<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<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> StorageAccess<T> for T

Source§

fn as_borrowed(&self) -> &T

Borrows the value.
Source§

fn into_taken(self) -> T

Takes the value.
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.
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