From 8fce2563c4ab884da66bcb3b031d512a6c1cfad5 Mon Sep 17 00:00:00 2001 From: Linwei Shang Date: Fri, 27 Oct 2023 16:38:13 -0400 Subject: [PATCH] async_trait --- Cargo.lock | 19 +++++++++++++++++ Cargo.toml | 2 +- async_trait/Cargo.toml | 13 ++++++++++++ async_trait/src/lib.rs | 46 ++++++++++++++++++++++++++++++++++++++++++ build.sh | 8 -------- dfx.json | 7 +++++++ 6 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 async_trait/Cargo.toml create mode 100644 async_trait/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 4602e17..479070e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,6 +14,25 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +[[package]] +name = "async-trait" +version = "0.1.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "async_trait" +version = "0.1.0" +dependencies = [ + "async-trait", + "ic-cdk", +] + [[package]] name = "autocfg" version = "1.1.0" diff --git a/Cargo.toml b/Cargo.toml index 1911c72..e397ba5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["unit_struct", "build_script", "stateful"] +members = ["unit_struct", "build_script", "stateful", "async_trait"] resolver = "2" [workspace.dependencies] diff --git a/async_trait/Cargo.toml b/async_trait/Cargo.toml new file mode 100644 index 0000000..41a6398 --- /dev/null +++ b/async_trait/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "async_trait" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +ic-cdk.workspace = true +async-trait = "0.1" + +[lib] +crate-type = ["cdylib"] diff --git a/async_trait/src/lib.rs b/async_trait/src/lib.rs new file mode 100644 index 0000000..1206361 --- /dev/null +++ b/async_trait/src/lib.rs @@ -0,0 +1,46 @@ +// ic_cdk::generate!({path: "../../counter.did", service : Canister, trait: Counter}); + +// Expand Start +#[async_trait::async_trait] +trait Counter { + async fn inc(); + async fn read() -> u64; +} + +#[export_name = "canister_update inc"] +fn __canister_method_inc() { + ic_cdk::setup(); + ic_cdk::spawn(async { + let _result = Canister::inc().await; + ic_cdk::api::call::reply(()) + }); +} + +#[export_name = "canister_query read"] +fn __canister_method_read() { + ic_cdk::setup(); + ic_cdk::spawn(async { + let result = Canister::read().await; + ic_cdk::api::call::reply((result,)) + }); +} +// Expand End + +use std::cell::Cell; + +thread_local! { + static COUNTER: Cell = Cell::new(0); +} + +struct Canister; + +#[async_trait::async_trait] +impl Counter for Canister { + async fn inc() { + COUNTER.set(COUNTER.get() + 1); + } + + async fn read() -> u64 { + COUNTER.get() + } +} diff --git a/build.sh b/build.sh index b3b4d1d..81d32ed 100644 --- a/build.sh +++ b/build.sh @@ -4,11 +4,3 @@ set -e cargo build --target wasm32-unknown-unknown \ --release \ --package "$1" - -# ic-wasm "$example_root/target/wasm32-unknown-unknown/release/$package.wasm" \ -# -o "$example_root/target/wasm32-unknown-unknown/release/$package.wasm" \ -# metadata candid:service -v public -f $did_file - -# ic-wasm "$example_root/target/wasm32-unknown-unknown/release/$package.wasm" \ -# -o "$example_root/target/wasm32-unknown-unknown/release/$package-opt.wasm" \ -# shrink diff --git a/dfx.json b/dfx.json index b4f814d..6027d4c 100644 --- a/dfx.json +++ b/dfx.json @@ -20,6 +20,13 @@ "candid": "counter.did", "wasm": "target/wasm32-unknown-unknown/release/stateful.wasm", "shrink": true + }, + "async_trait": { + "type": "custom", + "build": "sh build.sh async_trait", + "candid": "counter.did", + "wasm": "target/wasm32-unknown-unknown/release/async_trait.wasm", + "shrink": true } } } \ No newline at end of file