#[shard]Expand description
Transforms a function into a shard component that can be navigated to via the routing system and (optionally) provided with a lazily‑initialized per‑shard state.
§Features
- Generates a
StructNameDestination(UpperCamelCase +Destination) implementingtessera_ui_shard::router::RouterDestination - (Optional) Injects a single
#[state]parameter whose type:- Must implement
Default + Send + Sync + 'static - Is constructed (or reused) and passed to your function body
- Must implement
- Produces a stable shard ID:
module_path!()::function_name
§Lifecycle
Controlled by the generated destination (via #[state(...)]).
- Default:
Shard– state is removed when the destination ispop()‑ed - Override:
#[state(app)](or#[state(application)]) – persist for the entire application
When pop() is called and the destination lifecycle is Shard, the registry
entry is removed, freeing the state.
§Example
ⓘ
use tessera_ui::{shard, tessera};
#[tessera]
#[shard]
fn profile_page(#[state] state: ProfileState) {
// Build your UI. You can navigate:
// router::push(OtherPageDestination { ... });
}
#[derive(Default)]
struct ProfileState {
// fields...
}Pushing a shard:
ⓘ
use tessera_ui::router;
router::push(ProfilePageDestination { /* fields from fn params (excluding #[state]) */ });§Parameter Transformation
- At most one parameter may be annotated with
#[state]. - That parameter is removed from the generated function signature and supplied implicitly.
- All other parameters remain explicit and become public fields on the generated
*Destinationstruct.
§Generated Destination (Conceptual)
struct ProfilePageDestination { /* non-state params as public fields */ }
impl RouterDestination for ProfilePageDestination {
fn exec_component(&self) { profile_page(/* fields */); }
fn shard_id(&self) -> &'static str { "<module>::profile_page" }
}§Limitations
- No support for multiple
#[state]params (compile panic if violated) - Do not manually implement
RouterDestinationfor these pages; rely on generation
§See Also
- Routing helpers:
tessera_ui::router::{push, pop, router_root} - Shard state registry:
tessera_ui_shard::ShardRegistry
§Safety
Internally uses an unsafe cast inside the registry to recover Arc<T> from
Arc<dyn ShardState>; this is encapsulated and not exposed.
§Errors / Panics
- Panics at compile time if multiple
#[state]parameters are used or unsupported pattern forms are encountered.