pub struct ClientRouter { /* private fields */ }client-router only.Expand description
The main client-side router.
ClientRouter renders views using the Page type.
§Clone semantics
The Clone impl is shallow by design. Signal fields share their
underlying reactive state across clones, and on WASM the navigation
observer state (held behind Rc) is shared as well; only the route
table (Vec<ClientRoute> / HashMap<String, usize>) is copied
independently. As a result two clones see the same navigation state
but can diverge if either is mutated to register new routes — this
is not a deep clone of the router.
In practice Clone is only invoked by
collect_client_router_from_inventory (Refs #4453) as the fallback
path for Arc::try_unwrap when the underlying factory Arc is
shared, and ClientLauncher::register_routes_from_inventory() is the
only caller. Application code should NOT call .clone() directly to
“branch” routers; treat the router as a single owned value moved
into the launcher. Refs Copilot review on PR #4477.
Implementations§
Source§impl ClientRouter
impl ClientRouter
Sourcepub fn new() -> ClientRouter
Available on crate feature test and native only.
pub fn new() -> ClientRouter
test and native only.Creates a new router.
Sourcepub fn merge(self, other: ClientRouter) -> ClientRouter
Available on crate feature test and native only.
pub fn merge(self, other: ClientRouter) -> ClientRouter
test and native only.Combine another ClientRouter into this one.
Routes and named-route mappings from other are appended to self,
preserving the order in which routes were originally registered. The
reactive signals (current_path, current_params, current_route_name)
and the not_found handler from other are discarded — self’s
observation state is the one that drives the merged router.
§Named-route collisions
If both routers register the same named route, the entry from other
overwrites the entry from self (last-wins). This matches the way
UnifiedRouter::mount_unified already composes per-app routers, and
keeps merge callable in chains where the caller does not want to
handle errors. Use ClientRouter::try_merge for a fallible variant
that surfaces collisions instead of silently shadowing them.
§Examples
Composing per-app SPA routers produced by
#[url_patterns(InstalledApp::<app>, mode = client)] into the single
ClientRouter that ClientLauncher::router_client expects:
let router = polls_client_url_patterns()
.merge(users_client_url_patterns());Sourcepub fn try_merge(self, other: ClientRouter) -> Result<ClientRouter, MergeError>
Available on crate feature test and native only.
pub fn try_merge(self, other: ClientRouter) -> Result<ClientRouter, MergeError>
test and native only.Like ClientRouter::merge, but fail if any named route collides.
Validates first, so on Err self is dropped without being mutated.
On success the semantics are identical to merge (routes appended,
other’s signals and not_found discarded).
§Errors
Returns MergeError::NameCollision carrying a colliding name when
at least one named route is registered in both routers. When several
names collide, the returned name is one of them; the choice is
unspecified because named routes are stored in a HashMap.
§Examples
match polls_client_url_patterns().try_merge(users_client_url_patterns()) {
Ok(router) => launcher.router_client(|| router),
Err(MergeError::NameCollision { name }) => {
panic!("two apps register the route `{name}`");
}
}Sourcepub fn with_namespace(self, namespace: &str) -> ClientRouter
Available on crate feature test and native only.
pub fn with_namespace(self, namespace: &str) -> ClientRouter
test and native only.Prefix all named route keys with "namespace:".
This is the client-side equivalent of ServerRouter::with_namespace().
Called by #[url_patterns(InstalledApp::<variant>, mode = client)] (or
mode = unified) to ensure registered names match the "app:route"
format used by per-app resolver structs.
Sourcepub fn route<F>(self, pattern: &str, component: F) -> ClientRouter
Available on crate feature test and native only.
pub fn route<F>(self, pattern: &str, component: F) -> ClientRouter
test and native only.Adds a route to the router.
Sourcepub fn named_route<F>(
self,
name: &str,
pattern: &str,
component: F,
) -> ClientRouter
Available on crate feature test and native only.
pub fn named_route<F>( self, name: &str, pattern: &str, component: F, ) -> ClientRouter
test and native only.Adds a named route to the router.
Sourcepub fn route_params<F, T>(self, pattern: &str, handler: F) -> ClientRouter
Available on crate feature test and native only.
pub fn route_params<F, T>(self, pattern: &str, handler: F) -> ClientRouter
test and native only.Adds a route with typed path parameters.
Sourcepub fn named_route_params<F, T>(
self,
name: &str,
pattern: &str,
handler: F,
) -> ClientRouter
Available on crate feature test and native only.
pub fn named_route_params<F, T>( self, name: &str, pattern: &str, handler: F, ) -> ClientRouter
test and native only.Adds a named route with typed path parameters.
Sourcepub fn route_result<F, T, E>(self, pattern: &str, handler: F) -> ClientRouter
Available on crate feature test and native only.
pub fn route_result<F, T, E>(self, pattern: &str, handler: F) -> ClientRouter
test and native only.Adds a route with typed path parameters that returns a Result.
Sourcepub fn named_route_result<F, T, E>(
self,
name: &str,
pattern: &str,
handler: F,
) -> ClientRouter
Available on crate feature test and native only.
pub fn named_route_result<F, T, E>( self, name: &str, pattern: &str, handler: F, ) -> ClientRouter
test and native only.Adds a named route with typed path parameters that returns a Result.
Sourcepub fn guarded_route<F, G>(
self,
pattern: &str,
component: F,
guard: G,
) -> ClientRouter
Available on crate feature test and native only.
pub fn guarded_route<F, G>( self, pattern: &str, component: F, guard: G, ) -> ClientRouter
test and native only.Adds a route with a guard.
Sourcepub fn route_path<F, T>(self, pattern: &str, handler: F) -> ClientRouter
Available on crate feature test and native only.
pub fn route_path<F, T>(self, pattern: &str, handler: F) -> ClientRouter
test and native only.Sourcepub fn named_route_path<F, T>(
self,
name: &str,
pattern: &str,
handler: F,
) -> ClientRouter
Available on crate feature test and native only.
pub fn named_route_path<F, T>( self, name: &str, pattern: &str, handler: F, ) -> ClientRouter
test and native only.Adds a named route with a single path parameter using Path<T> extractor.
Sourcepub fn route_path2<F, T1, T2>(self, pattern: &str, handler: F) -> ClientRouter
Available on crate feature test and native only.
pub fn route_path2<F, T1, T2>(self, pattern: &str, handler: F) -> ClientRouter
test and native only.Sourcepub fn named_route_path2<F, T1, T2>(
self,
name: &str,
pattern: &str,
handler: F,
) -> ClientRouter
Available on crate feature test and native only.
pub fn named_route_path2<F, T1, T2>( self, name: &str, pattern: &str, handler: F, ) -> ClientRouter
test and native only.Adds a named route with two path parameters.
Sourcepub fn route_path3<F, T1, T2, T3>(
self,
pattern: &str,
handler: F,
) -> ClientRouter
Available on crate feature test and native only.
pub fn route_path3<F, T1, T2, T3>( self, pattern: &str, handler: F, ) -> ClientRouter
test and native only.Sourcepub fn named_route_path3<F, T1, T2, T3>(
self,
name: &str,
pattern: &str,
handler: F,
) -> ClientRouter
Available on crate feature test and native only.
pub fn named_route_path3<F, T1, T2, T3>( self, name: &str, pattern: &str, handler: F, ) -> ClientRouter
test and native only.Adds a named route with three path parameters.
Sourcepub fn not_found<F>(self, component: F) -> ClientRouter
Available on crate feature test and native only.
pub fn not_found<F>(self, component: F) -> ClientRouter
test and native only.Sets the not found handler.
Sourcepub fn current_path(&self) -> &Signal<String>
Available on crate feature test and native only.
pub fn current_path(&self) -> &Signal<String>
test and native only.Returns the current path signal.
Sourcepub fn current_params(&self) -> &Signal<HashMap<String, String>>
Available on crate feature test and native only.
pub fn current_params(&self) -> &Signal<HashMap<String, String>>
test and native only.Returns the current params signal.
Sourcepub fn current_route_name(&self) -> &Signal<Option<String>>
Available on crate feature test and native only.
pub fn current_route_name(&self) -> &Signal<Option<String>>
test and native only.Returns the current route name signal.
Sourcepub fn route_patterns(&self) -> impl Iterator<Item = (&str, Option<&str>)>
Available on crate feature test and native only.
pub fn route_patterns(&self) -> impl Iterator<Item = (&str, Option<&str>)>
test and native only.Returns an iterator over registered route patterns and their optional names.
Each item is (pattern_str, name) where name is Some for named routes.
Intended for diagnostic output (e.g., the runserver startup banner).
Sourcepub fn match_path(&self, path: &str) -> Option<ClientRouteMatch>
Available on crate feature test and native only.
pub fn match_path(&self, path: &str) -> Option<ClientRouteMatch>
test and native only.Matches a path against registered routes.
Sourcepub fn push(&self, path: &str) -> Result<(), RouterError>
Available on crate feature test and native only.
pub fn push(&self, path: &str) -> Result<(), RouterError>
test and native only.Navigates to a path using pushState.
Sourcepub fn replace(&self, path: &str) -> Result<(), RouterError>
Available on crate feature test and native only.
pub fn replace(&self, path: &str) -> Result<(), RouterError>
test and native only.Navigates to a path using replaceState.
Available on crate feature test and native only.
test and native only.Register a listener for navigation events.
Returns a NavigationSubscription handle. Drop the handle to
deregister the listener. The router itself only retains a Weak
reference, so dropping the subscription frees the listener
closure immediately. The stale Weak entry in
navigation_observers is pruned lazily on the next
notify_observers call (the listener itself is already gone by
then).
Robust against nested reactive nodes spawned during view rendering
because this subscription is independent of the reactive
Effect / Signal auto-tracking system.
Mirrors pages::Router::on_navigate. (Refs #4234)
On native targets (Fixes #4258) this is effectively a no-op: the
returned NavigationSubscription is unbound to any observer storage
because reactive observation only fires from the wasm popstate
listener. The method is still callable on native so that the
SpaRouter trait impl in reinhardt-pages (which dispatches into
on_navigate from cross-target launcher code) keeps compiling.
Sourcepub fn reverse(
&self,
name: &str,
params: &[(&str, &str)],
) -> Result<String, RouterError>
Available on crate feature test and native only.
pub fn reverse( &self, name: &str, params: &[(&str, &str)], ) -> Result<String, RouterError>
test and native only.Generates a URL by route name with parameters.
Sourcepub fn render_current(&self) -> Page
Available on crate feature test and native only.
pub fn render_current(&self) -> Page
test and native only.Renders the current route’s component.
Returns the registered not_found page when no route matches, or a
default 404 page if no not_found handler has been set.
Sourcepub fn route_count(&self) -> usize
Available on crate feature test and native only.
pub fn route_count(&self) -> usize
test and native only.Returns the number of registered routes.
Sourcepub fn has_route(&self, name: &str) -> bool
Available on crate feature test and native only.
pub fn has_route(&self, name: &str) -> bool
test and native only.Checks if a route name exists.
Sourcepub fn to_reverser(&self) -> ClientUrlReverser
Available on crate feature test and native only.
pub fn to_reverser(&self) -> ClientUrlReverser
test and native only.Extract a lightweight, thread-safe URL reverser.
The returned ClientUrlReverser contains only the
named-route-to-pattern mapping and can be shared across threads
(unlike ClientRouter itself which holds reactive signals).
Sourcepub fn setup_history_listener(&self)
Available on crate feature test and native only.
pub fn setup_history_listener(&self)
test and native only.Non-WASM version of setup_history_listener.
Trait Implementations§
Source§impl Clone for ClientRouter
impl Clone for ClientRouter
Source§fn clone(&self) -> ClientRouter
fn clone(&self) -> ClientRouter
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 ClientRouter
impl Debug for ClientRouter
Source§impl Default for ClientRouter
impl Default for ClientRouter
Source§fn default() -> ClientRouter
fn default() -> ClientRouter
Auto Trait Implementations§
impl Freeze for ClientRouter
impl !RefUnwindSafe for ClientRouter
impl Send for ClientRouter
impl Sync for ClientRouter
impl Unpin for ClientRouter
impl UnsafeUnpin for ClientRouter
impl !UnwindSafe for ClientRouter
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.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> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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 moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::RequestSource§impl<T> IntoResult<T> for T
impl<T> IntoResult<T> for T
type Err = Infallible
fn into_result(self) -> Result<T, <T as IntoResult<T>>::Err>
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().Source§impl<E> ServerFnErrorAssertions<E> for Ewhere
E: Debug,
impl<E> ServerFnErrorAssertions<E> for Ewhere
E: Debug,
Source§fn should_contain_message(&self, expected: &str)where
E: Display,
fn should_contain_message(&self, expected: &str)where
E: Display,
Source§fn should_have_message(&self, expected: &str)where
E: Display,
fn should_have_message(&self, expected: &str)where
E: Display,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.