fasterp 0.2.1

High-performance FASTQ preprocessing tool - often faster than fastp with the same interface
Documentation
name: CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
  workflow_dispatch:

jobs:
  test-and-build:
    runs-on: ubuntu-latest

    permissions:
      contents: read
      pages: write
      id-token: write

    steps:
    - uses: actions/checkout@v4

    - name: Install Rust
      uses: dtolnay/rust-toolchain@stable
      with:
        targets: wasm32-unknown-unknown

    - name: Cache cargo dependencies
      uses: actions/cache@v4
      with:
        path: |
          ~/.cargo/bin/
          ~/.cargo/registry/index/
          ~/.cargo/registry/cache/
          ~/.cargo/git/db/
          target/
          ~/.rustup/toolchains/*/lib/rustlib/wasm32-unknown-unknown/
        key: ${{ runner.os }}-cargo-wasm-${{ hashFiles('**/Cargo.lock') }}-v2

    - name: Cache test data
      uses: actions/cache@v4
      with:
        path: test_data/*.fastq.gz
        key: test-data-v1-SRR5808766

    - name: Install dependencies
      run: |
        # Install OpenSSL dev for native-tls
        sudo apt-get update
        sudo apt-get install -y libssl-dev

        # Install nucgen for test data generation
        cargo install nucgen --force
        nucgen --version

        # Install fastp for comparison
        wget http://opengene.org/fastp/fastp
        chmod +x fastp
        sudo mv fastp /usr/local/bin/
        fastp --version

        # Install mdBook for documentation
        cargo install mdbook --force
        mdbook --version

    - name: Generate test data
      run: |
        cd test_data
        bash getdata.sh

    - name: Download real test data
      run: bash .github/scripts/download_test_data.sh test_data

    - name: Build fasterp (release)
      run: cargo build --release

    - name: Run tests
      run: cargo test --release
      env:
        RUST_BACKTRACE: 1

    - name: Upload test results on failure
      if: failure()
      uses: actions/upload-artifact@v4
      with:
        name: test-results
        path: |
          test_data/*.fq
          target/debug/deps/*.log

    - name: Build WASM for playground
      run: |
        # Install wasm-bindgen-cli (matching version in Cargo.toml)
        cargo install wasm-bindgen-cli --version 0.2.92 --force

        # Build WASM
        cargo build --target wasm32-unknown-unknown --no-default-features --features wasm --lib --release

        # Generate JS bindings
        wasm-bindgen target/wasm32-unknown-unknown/release/fasterp.wasm \
          --out-dir pkg \
          --target web \
          --typescript

        # Copy to book playground
        mkdir -p book/src/playground/pkg
        cp -r pkg/* book/src/playground/pkg/

    - name: Build documentation
      run: |
        # Build mdBook
        cd book && mdbook build

        # Generate fastp report
        fastp \
          -i ../test_data/SRR5808766_1.fastq.gz \
          -I ../test_data/SRR5808766_2.fastq.gz \
          -o /tmp/fastp_out_1.fq \
          -O /tmp/fastp_out_2.fq \
          -j /tmp/fastp_report.json \
          -h book/fastp_report.html

        # Generate fasterp report
        ../target/release/fasterp \
          -i ../test_data/SRR5808766_1.fastq.gz \
          -I ../test_data/SRR5808766_2.fastq.gz \
          -o /tmp/fasterp_out_1.fq \
          -O /tmp/fasterp_out_2.fq \
          -j /tmp/fasterp_report.json \
          --html book/fasterp_report.html

    - name: Setup Pages
      if: github.ref == 'refs/heads/main' && github.event_name == 'push'
      uses: actions/configure-pages@v4
      with:
        enablement: true

    - name: Upload Pages artifact
      if: github.ref == 'refs/heads/main' && github.event_name == 'push'
      uses: actions/upload-pages-artifact@v3
      with:
        path: book/book

  deploy:
    needs: test-and-build
    if: github.ref == 'refs/heads/main' && github.event_name == 'push'
    runs-on: ubuntu-latest

    permissions:
      pages: write
      id-token: write

    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}

    steps:
    - name: Deploy to GitHub Pages
      id: deployment
      uses: actions/deploy-pages@v4