abi-adapter
English | 简体中文
Generate wasm interfaces for ordinary Rust functions. abi! converts arguments
according to a declaration, calls the target, and converts its result.
No third-party dependencies; supports no_std. Requires Rust 1.85+.
Quick start
Add the crate to your project:
cargo add abi-adapter
To use unreleased changes from main, depend on the Git repository instead:
cargo add abi-adapter --git https://github.com/vhexl/abi-adapter
use abi;
abi!
host generates a regular Rust function; guest("double.v1") generates a wasm export.
Each bracketed group maps to one target argument. Slots are Rust u32 values
and wasm i32 values; wrappers directly return zero or one slot.
Custom types use FromSlots<N> and IntoSlots<N>.
For a complete wasm example, see examples/guest.rs.
Users define runtime registration, memory protocols, and error codes. Panics from conversions and target functions are not caught; guest exports trap.
Documentation
The following guides are in Chinese:
- Usage guide: custom conversions,
ctx, wasm exports, and common problems. - Buffer example: multi-slot results and memory conventions.
- Architecture: modules, execution flow, and design decisions.
Development
node scripts/check.cjs runs fmt, clippy, test, doctest, doc, node,
wasm, and package in order. doctest tests documentation examples; doc
generates documentation. wasm builds and verifies the example.
Requires Rust 1.85+ (with rustfmt, Clippy, and the
wasm32-unknown-unknown target) and Node.js 22+.
node scripts/check.cjs --list
node scripts/check.cjs --only wasm
node scripts/check.cjs --skip doc --continue
node scripts/check.cjs --toolchain 1.85.0 --compatibility
--only/--skip accept comma-separated names and repeated flags; --list only lists steps.
Checks stop on the first failure by default. --continue runs remaining independent
checks, summarizes failures, and returns a nonzero exit code if any failed.
Cargo checks use --locked, permitting downloads without lockfile changes.
--toolchain selects an installed Rust version; use 1.85.0 above to check MSRV.
--compatibility skips fmt and clippy.
CI's test job reuses this script. Dependency auditing (cargo-deny) and coverage
remain separate CI jobs. A local run checks one platform and toolchain; CI also
checks its Linux/Windows and MSRV matrix and uploads coverage reports.
Releasing
This project uses release-plz to automate releases:
- Every push to
maintriggers release-plz to open/update a Release PR with the correct version bumps and a changelog derived from Conventional Commits. - Merge the Release PR when ready — release-plz will then:
- Create the git tag (
v<version>) - Publish to crates.io
- Create a GitHub release with release notes
- Create the git tag (
Publishing uses crates.io Trusted Publishing, so no registry token is stored; setup notes are in release-plz.yml.
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT license (LICENSE-MIT)
at your option.