#[export]
#
The #[hyperactor::export]
macro turns a regular Actor
implementation into a remotely spawnable actor, registering its type information, spawn
function, and supported message handlers for discovery and use across processes or runtimes.
What It Adds#
When applied to an actor type like this:
#[hyperactor::export(
spawn = true,
handlers = [ShoppingList],
)]
struct ShoppingListActor(HashSet<String>);
The macro expands to include:
A
Named
implementation for the actorA
Binds<Self>
implementation that registers supported message typesImplementations of
RemoteHandles<T>
for each type in thehandlers = [...]
listA
RemoteActor
marker implementationIf
spawn = true
, aRemotableActor
implementation and an inventory registration of thespawn
function.
This enables the actor to be:
Spawned dynamically by name
Routed to via typed messages
Reflected on at runtime (for diagnostics, tools, and orchestration)
Generated Implementations (simplified)#
impl RemoteActor for ShoppingListActor {}
impl RemoteHandles<ShoppingList> for ShoppingListActor {}
impl RemoteHandles<Signal> for ShoppingListActor {}
impl Binds<ShoppingListActor> for ShoppingListActor {
fn bind(ports: &Ports<Self>) {
ports.bind::<ShoppingList>();
}
}
impl Named for ShoppingListActor {
fn typename() -> &'static str {
"my_crate::ShoppingListActor"
}
}
If spawn = true
, the macro also emits:
impl RemotableActor for ShoppingListActor {}
This enables remote spawning via the default gspawn
provided by a blanket implementation.
It also registers the actor into inventory:
inventory::submit!(SpawnableActor {
name: ...,
gspawn: ...,
get_type_id: ...,
});
This allows the actor to be discovered and spawned by name at runtime.
Summary#
The #[export]
macro makes an actor remotely visible, spawnable, and routable by declaring:
What messages it handles
What messages it handles
How to bind those messages
What its globally unique name is
(Optionally) how to spawn it dynamically