canpack

Package multiple libraries into one ICP canister.
canpack
is a code generation tool which makes it easier to use Rust crates in different languages (such as Motoko) on the Internet Computer.
Note
This project is early in development; unannounced breaking changes may occur at any point.
Quick Start
TODO: Gitpod URL
Manual Setup
Ensure that the following software is installed on your system:
To create a new Motoko project, run dfx new my_project
, selecting "Motoko" for the backend and "No frontend canister" for the frontend. Once complete, run cd my_project
and open in your editor of choice.
Add a new file named canpack.json
(in the same directory as dfx.json
).
Define a Rust canister named my_project_backend_rust
in your canpack.json
file:
{
"canisters": {
"my_project_backend_rust": {
"type": "rust",
"parts": [{
"package": "canpack-example-hello"
}]
}
}
}
Next, run the following command in this directory to generate all necessary files:
npx canpack@latest
In your dfx.json
file, configure the "dependencies"
for the Motoko canister:
{
"canisters": {
"my_project_backend": {
"dependencies": ["my_project_backend_rust"],
"main": "src/my_project_backend/main.mo",
"type": "motoko"
}
},
}
Now you can call Rust functions from Motoko using a canister import:
import Rust "canister:motoko_rust";
actor {
public func hello(name: Text) : async Text {
await Rust.canpack_example_hello(name)
}
}
Run the following commands to build and deploy the dfx
project on your local machine:
dfx start --background
dfx deploy
Rust Crates
Add Canpack support to any IC Wasm-compatible Rust crate by exporting a top-level canpack!
macro.
For example (in your lib.rs
file):
pub fn hello(name: String) -> String {
format!("Hello, {name}!")
}
#[macro_export]
macro_rules! canpack {
() => {
#[ic_cdk::query]
#[candid::candid_method(query)]
fn canpack_example_hello(name: String) -> String {
$crate::hello(name)
}
};
}