audex 0.2.0

Audio metadata reading and writing library with flexible I/O and easy wrappers
Documentation
name: Release

on:
  push:
    branches: [main]
    paths:
      - "wasm/**"
      - "src/**"
      - "Cargo.toml"
  pull_request:
    branches: [main]
    paths:
      - "wasm/**"
      - "src/**"
      - "Cargo.toml"

# Restrict default permissions; only the release job gets write access.
permissions:
  contents: read

env:
  CARGO_TERM_COLOR: always
  RUSTFLAGS: -Dwarnings
  WASM_PACK_VERSION: "0.13.1"

jobs:
  check:
    name: WASM Compile Check
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
      - uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 # stable
        with:
          toolchain: stable
          targets: wasm32-unknown-unknown
      - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2.9.1
      - run: cargo check -p audex-wasm --target wasm32-unknown-unknown

  check-core:
    name: Core WASM Compile Check
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
      - uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 # stable
        with:
          toolchain: stable
          targets: wasm32-unknown-unknown
      - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2.9.1
      - run: cargo check -p audex --target wasm32-unknown-unknown --features serde

  clippy:
    name: WASM Clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
      - uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 # stable
        with:
          toolchain: stable
          components: clippy
          targets: wasm32-unknown-unknown
      - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2.9.1
      - run: cargo clippy -p audex-wasm --target wasm32-unknown-unknown -- -D warnings

  test-native:
    name: WASM Crate Unit Tests (native)
    runs-on: ubuntu-latest
    needs: [check]
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
      - uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 # stable
        with:
          toolchain: stable
      - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2.9.1
      - run: cargo test -p audex-wasm

  test-wasm:
    name: WASM Browser Tests
    runs-on: ubuntu-latest
    needs: [check]
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
      - uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 # stable
        with:
          toolchain: stable
          targets: wasm32-unknown-unknown
      - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2.9.1
      - name: Install wasm-pack
        run: cargo install wasm-pack --version "$WASM_PACK_VERSION" --locked
      - name: Run wasm-bindgen-test in headless Chrome
        working-directory: wasm
        run: wasm-pack test --headless --chrome

  build:
    name: WASM Build
    runs-on: ubuntu-latest
    if: github.event_name == 'push'
    needs: [check, check-core, clippy, test-native, test-wasm]
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
      - uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 # stable
        with:
          toolchain: stable
          targets: wasm32-unknown-unknown
      - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2.9.1

      - name: Install wasm-pack
        run: cargo install wasm-pack --version "$WASM_PACK_VERSION" --locked

      - name: Build (web target)
        working-directory: wasm
        run: wasm-pack build --target web --release

      - name: Build (nodejs target)
        working-directory: wasm
        run: wasm-pack build --target nodejs --release --out-dir pkg-node

      - name: Package web build
        run: tar -czf audex-wasm-web.tar.gz -C wasm/pkg .

      - name: Package node build
        run: tar -czf audex-wasm-node.tar.gz -C wasm/pkg-node .

      - name: Upload web artifact
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
        with:
          name: audex-wasm-web
          path: audex-wasm-web.tar.gz
          retention-days: 30

      - name: Upload node artifact
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
        with:
          name: audex-wasm-node
          path: audex-wasm-node.tar.gz
          retention-days: 30

  check-version:
    name: Check for new version
    runs-on: ubuntu-latest
    if: github.event_name == 'push'
    outputs:
      version: ${{ steps.version.outputs.version }}
      new_release: ${{ steps.tag.outputs.new_release }}
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
        with:
          fetch-depth: 0

      - name: Extract version from Cargo.toml
        id: version
        run: |

          VERSION=$(grep -m1 '^version' Cargo.toml | sed 's/version = "\(.*\)"/\1/')
          echo "version=${VERSION}" >> "$GITHUB_OUTPUT"

      - name: Check if tag already exists
        id: tag
        run: |

          if git rev-parse "v${{ steps.version.outputs.version }}" >/dev/null 2>&1; then
            echo "new_release=false" >> "$GITHUB_OUTPUT"
          else
            echo "new_release=true" >> "$GITHUB_OUTPUT"
          fi

  release:
    name: GitHub Release
    runs-on: ubuntu-latest
    needs: [check-version, build]
    if: needs.check-version.outputs.new_release == 'true'
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

      - name: Extract changelog
        id: changelog
        env:
          VERSION: ${{ needs.check-version.outputs.version }}
        run: |

          TITLE=$(awk "/^# ${VERSION//./\\.} /{print; exit}" CHANGELOG.md)
          TITLE="${TITLE#\# }"
          BODY=$(awk "/^# ${VERSION//./\\.} /{found=1; next} /^# /{if(found) exit} found{print}" CHANGELOG.md)
          echo "title=${TITLE}" >> "$GITHUB_OUTPUT"
          {
            echo "body<<CHANGELOG_EOF"
            echo "$BODY"
            echo "CHANGELOG_EOF"
          } >> "$GITHUB_OUTPUT"

      - name: Create tag
        env:
          VERSION: ${{ needs.check-version.outputs.version }}
        run: |

          git tag "v${VERSION}"
          git push origin "v${VERSION}"

      - name: Download web artifact
        uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
        with:
          name: audex-wasm-web

      - name: Download node artifact
        uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
        with:
          name: audex-wasm-node

      - name: Create GitHub Release
        uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1
        with:
          tag_name: v${{ needs.check-version.outputs.version }}
          name: ${{ steps.changelog.outputs.title }}
          body: ${{ steps.changelog.outputs.body }}
          files: |

            audex-wasm-web.tar.gz
            audex-wasm-node.tar.gz