macro_rules! Spawn {
(|$($param:ident : $type:ty),+ $(,)?| $body:block) => { ... };
($fn_name:ident($($arg:expr),* $(,)?)) => { ... };
(
|$($param:ident : $type:ty),+ $(,)?| $body:block,
$(
$key:ident : $value:expr
$(,)?
)*
) => { ... };
(
$fn_name:ident($($arg:expr),* $(,)?),
$(
$key:ident : $value:expr
$(,)?
)*
) => { ... };
}Expand description
The Spawn!() macro is defined here as a no-op.
However, in practice, kit build will rewrite it during pre-processing.
Examples:
fn init(our: Address) {
let parent = our.clone();
Spawn!(|parent: Address| {
println!("hello from {our}. I am Spawn of {parent}!");
});
...
}will be rewritten by kit build to:
- Generate a new child process within the package that, here,
println!()s, or, in general, executes the code given by the closure. - Replace the code lines in the parent process with
spawn()to start the generated child and send a [Request()] to pass in the closure’s args. - Update the relevant metadata for the package
(i.e.
Cargo.toml,metadata.json, etc.).
More example usage:
Can pass function call rather than closure:
fn init(our: Address) {
let parent = our.clone();
Spawn!(my_function(parent));
...
}Nested function calls work as expected.
Can optionally supply subset of spawn() arguments, namely
- name: &str,
- on_exit:
OnExit, - request_capabilities: Vec<
Capability>, - grant_capabilities: Vec<
ProcessId>, - public: bool, for example:
fn init(our: Address) {
let parent = our.clone();
Spawn!(my_function(parent), name: "hello-world", public: true);
...
}