dioxus-three 0.0.4

A Three.js 3D model viewer for Dioxus - supports Desktop, Web (WASM), and Mobile
Documentation
name: CI

on:
  push:
    branches: [main, master]
  pull_request:
    branches: [main, master]

env:
  CARGO_TERM_COLOR: always

jobs:
  test:
    name: Test
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
    steps:
      - uses: actions/checkout@v4

      - name: Install Linux dependencies
        if: matrix.os == 'ubuntu-latest'
        run: |
          sudo apt-get update
          sudo apt-get install -y libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev libsoup-3.0-dev libayatana-appindicator3-dev libxdo-dev

      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2

      - name: Run tests
        run: cargo test --all-features

  lint:
    name: Clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install Linux dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev libsoup-3.0-dev libayatana-appindicator3-dev libxdo-dev

      - uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy
      - uses: Swatinem/rust-cache@v2

      - name: Run clippy
        run: cargo clippy --all-targets --all-features -- -D warnings

  format:
    name: Format
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt

      - name: Check formatting
        run: cargo fmt --check

  doc:
    name: Documentation
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install Linux dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev libsoup-3.0-dev libayatana-appindicator3-dev libxdo-dev

      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2

      - name: Check documentation
        env:
          RUSTDOCFLAGS: -D warnings
        run: cargo doc --no-deps --all-features

  publish-dry-run:
    name: Publish Dry Run
    runs-on: ubuntu-latest
    needs: [test, lint, format, doc]
    if: github.event_name == 'pull_request'
    steps:
      - uses: actions/checkout@v4

      - name: Install Linux dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev libsoup-3.0-dev libayatana-appindicator3-dev libxdo-dev

      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2

      - name: Dry run publish
        run: cargo publish --dry-run --allow-dirty

  publish:
    name: Publish to crates.io
    runs-on: ubuntu-latest
    needs: [test, lint, format, doc]
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4

      - name: Install Linux dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev libsoup-3.0-dev libayatana-appindicator3-dev libxdo-dev

      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2

      - name: Extract local version
        id: local_version
        run: |
          VERSION=$(grep '^version' Cargo.toml | head -1 | sed 's/.*= *"\(.*\)".*/\1/')
          echo "version=$VERSION" >> $GITHUB_OUTPUT
          echo "Local version: $VERSION"

      - name: Fetch latest crates.io version
        id: crates_io_version
        run: |
          CRATES_IO_VERSION=$(curl -s https://crates.io/api/v1/crates/dioxus-three | jq -r '.crate.max_version')
          echo "version=$CRATES_IO_VERSION" >> $GITHUB_OUTPUT
          echo "Crates.io version: $CRATES_IO_VERSION"

      - name: Check if version should be published
        id: version_check
        run: |
          LOCAL="${{ steps.local_version.outputs.version }}"
          CRATES="${{ steps.crates_io_version.outputs.version }}"
          if [ "$LOCAL" != "$CRATES" ]; then
            echo "should_publish=true" >> $GITHUB_OUTPUT
            echo "đŸ“Ļ Version bumped: $CRATES -> $LOCAL"
          else
            echo "should_publish=false" >> $GITHUB_OUTPUT
            echo "â„šī¸ No version bump. Current: $LOCAL"
          fi

      - name: Publish to crates.io
        if: steps.version_check.outputs.should_publish == 'true'
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
        run: |
          echo "🚀 Publishing dioxus-three v${{ steps.local_version.outputs.version }}..."
          cargo publish --token "$CARGO_REGISTRY_TOKEN"
          echo "✅ Published successfully!"

      - name: Create Git tag
        if: steps.version_check.outputs.should_publish == 'true'
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          TAG="v${{ steps.local_version.outputs.version }}"
          git tag -a "$TAG" -m "Release $TAG"
          git push origin "$TAG"
          echo "đŸˇī¸ Created and pushed tag $TAG"

      - name: Create GitHub Release
        if: steps.version_check.outputs.should_publish == 'true'
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          TAG="v${{ steps.local_version.outputs.version }}"
          gh release create "$TAG" \
            --title "$TAG" \
            --generate-notes
          echo "🎉 Created GitHub Release $TAG"