1个不稳定版本
0.1.1 | 2024年3月27日 |
---|
#1272 in WebAssembly
86KB
1.5K SLoC
wasmcloud-provider-wit-bindgen
此crate包含一个Rust编译时过程宏,使开发基于WIT的WIT接口类型 wasmcloud能力提供者二进制文件变得容易。
快速入门
一切始于 wasmcloud_provider_wit_bindgen::generate
,例如
wasmcloud_provider_wit_bindgen::generate!({
impl_struct: KvRedisProvider,
contract: "wasmcloud:keyvalue",
wit_bindgen_cfg: "provider-kvredis"
});
假设你的源代码中存在一个名为 KvRedisProvider
的结构体,并且你在 wit/
文件夹中定义了一个名为 provider-kvredis
的世界,上面的宏将展开为 Trait
、struct
和实现wasmcloud能力提供者所需的其他机制。
[!注意]有关完整示例,请参阅
kv-redis
提供者在wasmcloud中
通过使用 generate
宏,你需要编写如下实现块
impl WasmcloudCapabilityProvider for KvRedisProvider {
async fn put_link(&self, ld: &LinkDefinition) -> bool { ... }
async fn delete_link(&self, actor_id: &str) { ... }
async fn shutdown(&self) { ... }
}
impl WasmcloudKeyvalueKeyValue for KvRedisProvider {
async fn get(&self, ctx: Context, arg: String) -> ProviderInvocationResult<GetResponse> { ... }
async fn set(&self, ctx: Context, arg: SetRequest) -> ProviderInvocationResult<()> { ... }
async fn del(&self, ctx: Context, arg: String) -> ProviderInvocationResult<bool> { ... }
...
}
不用担心,如上所示的 SetRequest
和 GetResponse
类型将由展开的宏代码提供。
重新导出
请注意,wasmcloud-provider-wit-bindgen
重新导出许多依赖项,以确保它们匹配且可一起使用。
建议在您的代码中使用这些依赖项,以避免重复依赖项,这可能会导致各种问题。例如以下use
块:
use wasmcloud_provider_wit_bindgen::deps::{
async_trait::async_trait,
serde::Deserialize,
serde_json,
wasmcloud_provider_sdk::core::LinkDefinition,
wasmcloud_provider_sdk::{load_host_data, start_provider, Context},
};
特殊情况:重用 serde
当重用重新导出的 serde
时,存在一个已知问题,要求您必须使用 #[serde(crate = "...")]
指令
#[derive(Deserialize)]
#[serde(crate = "wasmcloud_provider_wit_bindgen::deps::serde")]
struct ExampleStruct {
/// Some string that is part of this struct
#[serde(alias = "WORDS", alias = "Words")]
words: String,
}
依赖项
~35–49MB
~900K SLoC