From 4b4de3374c1c153bb97b0d36defe26a17b64df46 Mon Sep 17 00:00:00 2001 From: flemming-it Date: Sat, 11 Jul 2026 19:02:40 +0200 Subject: [PATCH] feat(sdk): rename attribute to #[chain_module], keep #[fai_module] alias The public macro name was the last product-scoped 'fai' identifier in the SDK surface. #[chain_module] is now the primary attribute (README + examples updated); #[fai_module] stays as a delegating alias so modules written before the rename keep compiling. 0.2.1. Signed-off-by: flemming-it --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- README.md | 6 +++--- crates/chain-module-sdk-macros/src/lib.rs | 15 ++++++++++++++- crates/chain-module-sdk/src/lib.rs | 11 ++++++----- examples/echo/Cargo.lock | 4 ++-- examples/echo/src/lib.rs | 4 ++-- examples/progress/Cargo.lock | 4 ++-- examples/progress/src/lib.rs | 2 +- 9 files changed, 33 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cc76d83..0d70b9d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,7 +43,7 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chain-module-sdk" -version = "0.2.0" +version = "0.2.1" dependencies = [ "chain-module-sdk-macros", "serde", @@ -55,7 +55,7 @@ dependencies = [ [[package]] name = "chain-module-sdk-macros" -version = "0.2.0" +version = "0.2.1" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 6fdd56c..bb0f709 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ members = [ ] [workspace.package] -version = "0.2.0" +version = "0.2.1" edition = "2024" authors = ["Dr. Stefan Flemming "] license = "Apache-2.0" diff --git a/README.md b/README.md index 9b3f7bd..b5bc4ca 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ A module written against this crate looks like: ```rust use chain_module_sdk::prelude::*; -#[fai_module] +#[chain_module] fn invoke(_ctx: Context, inputs: Inputs) -> Result { let text = inputs.require_text("input")?; Ok(Outputs::new().with_text("output", format!("echo: {text}"))) @@ -16,7 +16,7 @@ fn invoke(_ctx: Context, inputs: Inputs) -> Result { That single function — plus a `Cargo.toml` listing `chain-module-sdk` as a dependency — is the entire module. The -`#[fai_module]` macro generates the `wit_bindgen` invocation, the +`#[chain_module]` macro generates the `wit_bindgen` invocation, the `Guest` implementation, the type conversions, and the `wit_bindgen::export!` glue behind the scenes. @@ -28,7 +28,7 @@ That single function — plus a `Cargo.toml` listing | `Outputs::new().with_json(...)?` | building `Vec<(String, Payload)>` by hand | | `ModuleError::invalid_input("...")` | constructing WIT `invocation-error` variants | | `ctx.emit("progress", ...)` | hand-rolling the `host.emit-event` import (WIT 1.1) | -| `#[fai_module]` | `wit_bindgen::generate!` + `Guest` impl + `export!` + `#![allow(unsafe_op_in_unsafe_fn)]` | +| `#[chain_module]` | `wit_bindgen::generate!` + `Guest` impl + `export!` + `#![allow(unsafe_op_in_unsafe_fn)]` | ## Stability diff --git a/crates/chain-module-sdk-macros/src/lib.rs b/crates/chain-module-sdk-macros/src/lib.rs index 62032e7..3d0cfb5 100644 --- a/crates/chain-module-sdk-macros/src/lib.rs +++ b/crates/chain-module-sdk-macros/src/lib.rs @@ -1,6 +1,7 @@ //! Procedural macros powering `chain-module-sdk`. //! -//! This crate exists only to host the `#[fai_module]` attribute. +//! This crate exists only to host the `#[chain_module]` attribute +//! (and its legacy alias `#[fai_module]`). //! Module authors should depend on `chain-module-sdk` (which //! re-exports the macro), not on this crate directly. @@ -26,7 +27,19 @@ const WIT_INLINE: &str = include_str!("../../../wit/world.wit"); /// the `wit_bindgen::export!` call. The function can be named /// anything — only its signature matters. #[proc_macro_attribute] +pub fn chain_module(_attrs: TokenStream, input: TokenStream) -> TokenStream { + expand_module(input) +} + +/// Legacy alias for [`chain_module`], kept so modules written +/// before the product rename keep compiling. New code uses +/// `#[chain_module]`. +#[proc_macro_attribute] pub fn fai_module(_attrs: TokenStream, input: TokenStream) -> TokenStream { + expand_module(input) +} + +fn expand_module(input: TokenStream) -> TokenStream { let user_fn = parse_macro_input!(input as ItemFn); let user_fn_name = user_fn.sig.ident.clone(); let wit_literal = WIT_INLINE; diff --git a/crates/chain-module-sdk/src/lib.rs b/crates/chain-module-sdk/src/lib.rs index 88ff172..c103536 100644 --- a/crates/chain-module-sdk/src/lib.rs +++ b/crates/chain-module-sdk/src/lib.rs @@ -5,7 +5,7 @@ //! ```ignore //! use chain_module_sdk::prelude::*; //! -//! #[fai_module] +//! #[chain_module] //! fn invoke(_ctx: Context, inputs: Inputs) -> Result { //! let text = inputs.require_text("input")?; //! Ok(Outputs::new().with_text("output", format!("got: {text}"))) @@ -36,9 +36,9 @@ pub use inputs::Inputs; pub use outputs::Outputs; pub use payload::{BytesValue, FileRef, Payload}; -pub use chain_module_sdk_macros::fai_module; +pub use chain_module_sdk_macros::{chain_module, fai_module}; -// Emit-hook plumbing used by the `#[fai_module]` expansion (wasm32) +// Emit-hook plumbing used by the `#[chain_module]` expansion (wasm32) // so `Context::emit` reaches the WIT `emit-event` host import. #[doc(hidden)] pub use host::__set_emit_hook; @@ -48,11 +48,12 @@ pub(crate) use host::emit; /// every type a typical module needs into scope. pub mod prelude { pub use super::{ - BytesValue, Context, FileRef, Inputs, ModuleError, Outputs, Payload, fai_module, + BytesValue, Context, FileRef, Inputs, ModuleError, Outputs, Payload, chain_module, + fai_module, }; } -/// Internal re-exports the `#[fai_module]` macro expansion depends on. +/// Internal re-exports the `#[chain_module]` macro expansion depends on. /// /// Not part of the public API. Anything in this module may change /// between SDK patch releases. diff --git a/examples/echo/Cargo.lock b/examples/echo/Cargo.lock index 9fa9f77..8b91627 100644 --- a/examples/echo/Cargo.lock +++ b/examples/echo/Cargo.lock @@ -34,7 +34,7 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chain-module-sdk" -version = "0.1.2" +version = "0.2.0" dependencies = [ "chain-module-sdk-macros", "serde", @@ -45,7 +45,7 @@ dependencies = [ [[package]] name = "chain-module-sdk-macros" -version = "0.1.2" +version = "0.2.0" dependencies = [ "proc-macro2", "quote", diff --git a/examples/echo/src/lib.rs b/examples/echo/src/lib.rs index b85330e..4d2a55b 100644 --- a/examples/echo/src/lib.rs +++ b/examples/echo/src/lib.rs @@ -1,13 +1,13 @@ //! Minimum-viable F∆I module — echoes the first text input. //! //! Demonstrates the entire authoring surface: a single function -//! decorated with `#[fai_module]`. No `wit_bindgen`, no +//! decorated with `#[chain_module]`. No `wit_bindgen`, no //! `unsafe_op_in_unsafe_fn` allow, no `export!` call, no manual //! Payload-variant matching. use chain_module_sdk::prelude::*; -#[fai_module] +#[chain_module] fn invoke(_ctx: Context, inputs: Inputs) -> Result { let text = inputs.require_text("input")?; Ok(Outputs::new().with_text("output", format!("echo: {text}"))) diff --git a/examples/progress/Cargo.lock b/examples/progress/Cargo.lock index 5282f1f..ff92268 100644 --- a/examples/progress/Cargo.lock +++ b/examples/progress/Cargo.lock @@ -34,7 +34,7 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chain-module-sdk" -version = "0.1.2" +version = "0.2.0" dependencies = [ "chain-module-sdk-macros", "serde", @@ -45,7 +45,7 @@ dependencies = [ [[package]] name = "chain-module-sdk-macros" -version = "0.1.2" +version = "0.2.0" dependencies = [ "proc-macro2", "quote", diff --git a/examples/progress/src/lib.rs b/examples/progress/src/lib.rs index b222155..c034c9b 100644 --- a/examples/progress/src/lib.rs +++ b/examples/progress/src/lib.rs @@ -6,7 +6,7 @@ use chain_module_sdk::prelude::*; -#[fai_module] +#[chain_module] fn invoke(ctx: Context, inputs: Inputs) -> Result { let text = inputs.require_text("input")?;