1个不稳定版本

0.1.1 2024年3月27日

#1272 in WebAssembly

Apache-2.0

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 的世界,上面的宏将展开为 Traitstruct 和实现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> { ... }
    ...
}

不用担心,如上所示的 SetRequestGetResponse 类型将由展开的宏代码提供。

重新导出

请注意,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