abi-adapter 0.1.1

Mechanical slot-based ABI adapter for wasm boundaries
Documentation
  • Coverage
  • 100%
    6 out of 6 items documented4 out of 4 items with examples
  • Size
  • Source code size: 111.8 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 162.2 kB This is the summed size of all files generated by rustdoc for all configured targets
  • Ø build duration
  • this release: 5s Average build duration of successful builds.
  • all releases: 3s Average build duration of successful builds in releases after 2024-10-23.
  • Links
  • Homepage
  • vhexl/abi-adapter
    0 0 0
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • vhexl

abi-adapter

CI codecov crates.io docs.rs MSRV License

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_adapter::abi;

fn double(value: u32) -> u32 {
    value * 2
}

abi! { host pub fn double_abi([value]) -> 1 => crate::double; }

fn main() {
    assert_eq!(double_abi(21), 42);
}

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 the full local check: formatting, Clippy, tests, Rustdoc, the wasm build and verification, and a package build. It needs Rust 1.85+ (with rustfmt, Clippy, and the wasm32-unknown-unknown target) and Node.js 22+. To verify the minimum supported Rust version, install 1.85.0 with the same target and run node scripts/check.cjs --toolchain 1.85.0 --compatibility.

Releasing

This project uses release-plz to automate releases:

  1. Every push to main triggers release-plz to open/update a Release PR with the correct version bumps and a changelog derived from Conventional Commits.
  2. 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

Publishing uses crates.io Trusted Publishing, so no registry token is stored; setup notes are in release-plz.yml.

License

Licensed under either of

at your option.