Compare commits

..

No commits in common. "main" and "v0.2.0" have entirely different histories.
main ... v0.2.0

15 changed files with 28 additions and 28 deletions

4
Cargo.lock generated
View file

@ -43,7 +43,7 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]] [[package]]
name = "chain-module-sdk" name = "chain-module-sdk"
version = "0.3.0" version = "0.2.0"
dependencies = [ dependencies = [
"chain-module-sdk-macros", "chain-module-sdk-macros",
"serde", "serde",
@ -55,7 +55,7 @@ dependencies = [
[[package]] [[package]]
name = "chain-module-sdk-macros" name = "chain-module-sdk-macros"
version = "0.3.0" version = "0.2.0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View file

@ -6,7 +6,7 @@ members = [
] ]
[workspace.package] [workspace.package]
version = "0.3.0" version = "0.2.0"
edition = "2024" edition = "2024"
authors = ["Dr. Stefan Flemming <chain@flemming.ai>"] authors = ["Dr. Stefan Flemming <chain@flemming.ai>"]
license = "Apache-2.0" license = "Apache-2.0"

View file

@ -7,7 +7,7 @@ A module written against this crate looks like:
```rust ```rust
use chain_module_sdk::prelude::*; use chain_module_sdk::prelude::*;
#[chain_module] #[fai_module]
fn invoke(_ctx: Context, inputs: Inputs) -> Result<Outputs, ModuleError> { fn invoke(_ctx: Context, inputs: Inputs) -> Result<Outputs, ModuleError> {
let text = inputs.require_text("input")?; let text = inputs.require_text("input")?;
Ok(Outputs::new().with_text("output", format!("echo: {text}"))) Ok(Outputs::new().with_text("output", format!("echo: {text}")))
@ -16,7 +16,7 @@ fn invoke(_ctx: Context, inputs: Inputs) -> Result<Outputs, ModuleError> {
That single function — plus a `Cargo.toml` listing That single function — plus a `Cargo.toml` listing
`chain-module-sdk` as a dependency — is the entire module. The `chain-module-sdk` as a dependency — is the entire module. The
`#[chain_module]` macro generates the `wit_bindgen` invocation, the `#[fai_module]` macro generates the `wit_bindgen` invocation, the
`Guest` implementation, the type conversions, and the `Guest` implementation, the type conversions, and the
`wit_bindgen::export!` glue behind the scenes. `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 | | `Outputs::new().with_json(...)?` | building `Vec<(String, Payload)>` by hand |
| `ModuleError::invalid_input("...")` | constructing WIT `invocation-error` variants | | `ModuleError::invalid_input("...")` | constructing WIT `invocation-error` variants |
| `ctx.emit("progress", ...)` | hand-rolling the `host.emit-event` import (WIT 1.1) | | `ctx.emit("progress", ...)` | hand-rolling the `host.emit-event` import (WIT 1.1) |
| `#[chain_module]` | `wit_bindgen::generate!` + `Guest` impl + `export!` + `#![allow(unsafe_op_in_unsafe_fn)]` | | `#[fai_module]` | `wit_bindgen::generate!` + `Guest` impl + `export!` + `#![allow(unsafe_op_in_unsafe_fn)]` |
## Stability ## Stability

View file

@ -1,6 +1,6 @@
//! Procedural macros powering `chain-module-sdk`. //! Procedural macros powering `chain-module-sdk`.
//! //!
//! This crate exists only to host the `#[chain_module]` attribute. //! This crate exists only to host the `#[fai_module]` attribute.
//! Module authors should depend on `chain-module-sdk` (which //! Module authors should depend on `chain-module-sdk` (which
//! re-exports the macro), not on this crate directly. //! re-exports the macro), not on this crate directly.
@ -26,7 +26,7 @@ const WIT_INLINE: &str = include_str!("../../../wit/world.wit");
/// the `wit_bindgen::export!` call. The function can be named /// the `wit_bindgen::export!` call. The function can be named
/// anything — only its signature matters. /// anything — only its signature matters.
#[proc_macro_attribute] #[proc_macro_attribute]
pub fn chain_module(_attrs: TokenStream, input: TokenStream) -> TokenStream { pub fn fai_module(_attrs: TokenStream, input: TokenStream) -> TokenStream {
let user_fn = parse_macro_input!(input as ItemFn); let user_fn = parse_macro_input!(input as ItemFn);
let user_fn_name = user_fn.sig.ident.clone(); let user_fn_name = user_fn.sig.ident.clone();
let wit_literal = WIT_INLINE; let wit_literal = WIT_INLINE;

View file

@ -1,7 +1,7 @@
//! Invocation context passed to a module on every call. //! Invocation context passed to a module on every call.
//! //!
//! Mirrors the WIT `invocation-context` record. The //! Mirrors the WIT `invocation-context` record. The
//! `#[chain_module]` macro builds this from the WIT-generated value //! `#[fai_module]` macro builds this from the WIT-generated value
//! before handing it to user code. //! before handing it to user code.
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]

View file

@ -1,7 +1,7 @@
//! Host-callback plumbing for `Context::emit` (WIT 1.1 `emit-event`). //! Host-callback plumbing for `Context::emit` (WIT 1.1 `emit-event`).
//! //!
//! The WIT host imports (`emit-event`) are only reachable from the //! The WIT host imports (`emit-event`) are only reachable from the
//! `wit_bindgen`-generated glue inside the `#[chain_module]` expansion, //! `wit_bindgen`-generated glue inside the `#[fai_module]` expansion,
//! which lives in the module crate — not here. So the macro installs a //! which lives in the module crate — not here. So the macro installs a
//! function pointer that reaches the real host import, and //! function pointer that reaches the real host import, and
//! [`Context::emit`](crate::Context::emit) calls it through this hook. //! [`Context::emit`](crate::Context::emit) calls it through this hook.
@ -18,7 +18,7 @@ thread_local! {
static EMIT_HOOK: Cell<Option<fn(&str, Payload)>> = const { Cell::new(None) }; static EMIT_HOOK: Cell<Option<fn(&str, Payload)>> = const { Cell::new(None) };
} }
/// Install the emit hook. Called by the `#[chain_module]` expansion at /// Install the emit hook. Called by the `#[fai_module]` expansion at
/// the start of each invocation. Not part of the stable public API. /// the start of each invocation. Not part of the stable public API.
#[doc(hidden)] #[doc(hidden)]
pub fn __set_emit_hook(f: fn(&str, Payload)) { pub fn __set_emit_hook(f: fn(&str, Payload)) {

View file

@ -19,7 +19,7 @@ pub struct Inputs {
impl Inputs { impl Inputs {
/// Build directly from a list of `(name, payload)` pairs. /// Build directly from a list of `(name, payload)` pairs.
/// Used by the `#[chain_module]` macro after WIT conversion. /// Used by the `#[fai_module]` macro after WIT conversion.
#[doc(hidden)] #[doc(hidden)]
pub fn __from_pairs(items: Vec<(String, Payload)>) -> Self { pub fn __from_pairs(items: Vec<(String, Payload)>) -> Self {
Self { items } Self { items }

View file

@ -5,7 +5,7 @@
//! ```ignore //! ```ignore
//! use chain_module_sdk::prelude::*; //! use chain_module_sdk::prelude::*;
//! //!
//! #[chain_module] //! #[fai_module]
//! fn invoke(_ctx: Context, inputs: Inputs) -> Result<Outputs, ModuleError> { //! fn invoke(_ctx: Context, inputs: Inputs) -> Result<Outputs, ModuleError> {
//! let text = inputs.require_text("input")?; //! let text = inputs.require_text("input")?;
//! Ok(Outputs::new().with_text("output", format!("got: {text}"))) //! Ok(Outputs::new().with_text("output", format!("got: {text}")))
@ -36,9 +36,9 @@ pub use inputs::Inputs;
pub use outputs::Outputs; pub use outputs::Outputs;
pub use payload::{BytesValue, FileRef, Payload}; pub use payload::{BytesValue, FileRef, Payload};
pub use chain_module_sdk_macros::chain_module; pub use chain_module_sdk_macros::fai_module;
// Emit-hook plumbing used by the `#[chain_module]` expansion (wasm32) // Emit-hook plumbing used by the `#[fai_module]` expansion (wasm32)
// so `Context::emit` reaches the WIT `emit-event` host import. // so `Context::emit` reaches the WIT `emit-event` host import.
#[doc(hidden)] #[doc(hidden)]
pub use host::__set_emit_hook; pub use host::__set_emit_hook;
@ -48,11 +48,11 @@ pub(crate) use host::emit;
/// every type a typical module needs into scope. /// every type a typical module needs into scope.
pub mod prelude { pub mod prelude {
pub use super::{ pub use super::{
BytesValue, Context, FileRef, Inputs, ModuleError, Outputs, Payload, chain_module, BytesValue, Context, FileRef, Inputs, ModuleError, Outputs, Payload, fai_module,
}; };
} }
/// Internal re-exports the `#[chain_module]` macro expansion depends on. /// Internal re-exports the `#[fai_module]` macro expansion depends on.
/// ///
/// Not part of the public API. Anything in this module may change /// Not part of the public API. Anything in this module may change
/// between SDK patch releases. /// between SDK patch releases.

View file

@ -71,7 +71,7 @@ impl Outputs {
} }
/// Consume the builder into the underlying `(name, payload)` list. /// Consume the builder into the underlying `(name, payload)` list.
/// Used by the `#[chain_module]` macro after WIT conversion. /// Used by the `#[fai_module]` macro after WIT conversion.
#[doc(hidden)] #[doc(hidden)]
pub fn __into_pairs(self) -> Vec<(String, Payload)> { pub fn __into_pairs(self) -> Vec<(String, Payload)> {
self.items self.items

View file

@ -2,7 +2,7 @@
//! //!
//! The shape is fixed by the v1.0 WIT freeze. Field-by-field //! The shape is fixed by the v1.0 WIT freeze. Field-by-field
//! conversion to and from the WIT-generated type happens inside //! conversion to and from the WIT-generated type happens inside
//! the `#[chain_module]` macro expansion in the user crate. //! the `#[fai_module]` macro expansion in the user crate.
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};

View file

@ -34,7 +34,7 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]] [[package]]
name = "chain-module-sdk" name = "chain-module-sdk"
version = "0.2.1" version = "0.1.2"
dependencies = [ dependencies = [
"chain-module-sdk-macros", "chain-module-sdk-macros",
"serde", "serde",
@ -45,7 +45,7 @@ dependencies = [
[[package]] [[package]]
name = "chain-module-sdk-macros" name = "chain-module-sdk-macros"
version = "0.2.1" version = "0.1.2"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View file

@ -10,7 +10,7 @@ version = "0.1.0"
edition = "2024" edition = "2024"
license = "Apache-2.0" license = "Apache-2.0"
publish = false publish = false
description = "Reference module showing the minimum needed to write a Ch∆In module with chain-module-sdk." description = "Reference module showing the minimum needed to write an F∆I module with chain-module-sdk."
[lib] [lib]
crate-type = ["cdylib"] crate-type = ["cdylib"]

View file

@ -1,13 +1,13 @@
//! Minimum-viable Ch∆In module — echoes the first text input. //! Minimum-viable F∆I module — echoes the first text input.
//! //!
//! Demonstrates the entire authoring surface: a single function //! Demonstrates the entire authoring surface: a single function
//! decorated with `#[chain_module]`. No `wit_bindgen`, no //! decorated with `#[fai_module]`. No `wit_bindgen`, no
//! `unsafe_op_in_unsafe_fn` allow, no `export!` call, no manual //! `unsafe_op_in_unsafe_fn` allow, no `export!` call, no manual
//! Payload-variant matching. //! Payload-variant matching.
use chain_module_sdk::prelude::*; use chain_module_sdk::prelude::*;
#[chain_module] #[fai_module]
fn invoke(_ctx: Context, inputs: Inputs) -> Result<Outputs, ModuleError> { fn invoke(_ctx: Context, inputs: Inputs) -> Result<Outputs, ModuleError> {
let text = inputs.require_text("input")?; let text = inputs.require_text("input")?;
Ok(Outputs::new().with_text("output", format!("echo: {text}"))) Ok(Outputs::new().with_text("output", format!("echo: {text}")))

View file

@ -34,7 +34,7 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]] [[package]]
name = "chain-module-sdk" name = "chain-module-sdk"
version = "0.3.0" version = "0.1.2"
dependencies = [ dependencies = [
"chain-module-sdk-macros", "chain-module-sdk-macros",
"serde", "serde",
@ -45,7 +45,7 @@ dependencies = [
[[package]] [[package]]
name = "chain-module-sdk-macros" name = "chain-module-sdk-macros"
version = "0.3.0" version = "0.1.2"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View file

@ -6,7 +6,7 @@
use chain_module_sdk::prelude::*; use chain_module_sdk::prelude::*;
#[chain_module] #[fai_module]
fn invoke(ctx: Context, inputs: Inputs) -> Result<Outputs, ModuleError> { fn invoke(ctx: Context, inputs: Inputs) -> Result<Outputs, ModuleError> {
let text = inputs.require_text("input")?; let text = inputs.require_text("input")?;