spacewasm 0.4.1

A no_std WebAssembly 1.0 decoder, validator, and interpreter for on-board spacecraft use
Documentation
name: Release
on:
  push:
    tags:
      - "v[0-9]+.[0-9]+.[0-9]+*"

permissions:
  contents: write

jobs:
  publish:
    name: Publish to crates.io
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Inject version from tag
        run: |
          tag_version="${GITHUB_REF_NAME#v}"
          echo "Releasing version: $tag_version"
          # Replace the 0.0.0 placeholder under [workspace.package] with the tag version.
          sed -i 's/^version = "0\.0\.0"$/version = "'"$tag_version"'"/' Cargo.toml
          # Pin spacewasm_c_api's dependency on spacewasm to the exact tag version.
          # Its manifest carries a `version = "=0.0.0"` placeholder for this.
          sed -i 's/version = "=0\.0\.0"/version = "='"$tag_version"'"/' crates/spacewasm_c_api/Cargo.toml
          # Fail if any placeholder was not found / not replaced.
          for pkg in spacewasm spacewasm_c_api; do
            crate_version=$(cargo metadata --no-deps --format-version 1 \
              | jq -r '.packages[] | select(.name == "'"$pkg"'") | .version')
            if [ "$crate_version" != "$tag_version" ]; then
              echo "::error::Failed to inject version for $pkg. Expected $tag_version but Cargo.toml resolves to $crate_version. Is the 0.0.0 placeholder still present?"
              exit 1
            fi
          done
          dep_version=$(cargo metadata --no-deps --format-version 1 \
            | jq -r '.packages[] | select(.name == "spacewasm_c_api") | .dependencies[] | select(.name == "spacewasm") | .req')
          if [ "$dep_version" != "=$tag_version" ]; then
            echo "::error::spacewasm_c_api's spacewasm dependency resolves to '$dep_version', expected '=$tag_version'. Is the =0.0.0 placeholder still present?"
            exit 1
          fi

      - name: Install WABT (WebAssembly Binary Toolkit)
        run: |
          WABT_VERSION=1.0.41
          WABT_PLATFORM="linux-x64"
          wget https://github.com/WebAssembly/wabt/releases/download/${WABT_VERSION}/wabt-${WABT_VERSION}-${WABT_PLATFORM}.tar.gz
          tar -xzf wabt-${WABT_VERSION}-${WABT_PLATFORM}.tar.gz
          sudo cp wabt-${WABT_VERSION}/bin/* /usr/local/bin/

      - name: Run tests
        run: cargo test --workspace --verbose

      - name: Publish spacewasm to crates.io
        # --allow-dirty: the injected version is an uncommitted working-tree change.
        run: cargo publish -p spacewasm --allow-dirty
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}

      - name: Publish spacewasm_c_api to crates.io
        # Published after spacewasm since it depends on the exact matching
        # release. cargo waits for the dependency to be available in the index.
        # --allow-dirty: the injected version is an uncommitted working-tree change.
        # --no-verify: Work around 'unwinding panics are not supported without std'
        run: cargo publish -p spacewasm_c_api --allow-dirty --no-verify
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}

      - name: Create GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          generate_release_notes: true