optimizer 0.2.0

A Rust library for optimization algorithms.
Documentation
name: CI

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

env:
  CARGO_TERM_COLOR: always

jobs:
  fmt:
    name: Format
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Install Rust
        run: |
          rustup override set stable
          rustup update stable
          rustup component add rustfmt
      - run: cargo fmt --all --check

  clippy:
    name: Clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Install Rust
        run: |
          rustup override set stable
          rustup update stable
          rustup component add clippy
      - uses: Swatinem/rust-cache@v2
      - run: cargo clippy --all-targets --all-features -- -D warnings

  test:
    name: Test
    runs-on: ubuntu-latest
    strategy:
      matrix:
        features:
          - ""
          - "async"
    steps:
      - uses: actions/checkout@v6
      - name: Install Rust
        run: |
          rustup override set stable
          rustup update stable
      - uses: Swatinem/rust-cache@v2
      - name: Run tests
        run: |
          if [ -z "${{ matrix.features }}" ]; then
            cargo test --verbose
          else
            cargo test --verbose --features "${{ matrix.features }}"
          fi

  docs:
    name: Docs
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Install Rust
        run: |
          rustup override set stable
          rustup update stable
      - uses: Swatinem/rust-cache@v2
      - run: cargo doc --all-features --no-deps
        env:
          RUSTDOCFLAGS: -D warnings

  feature-check:
    name: Feature Combinations
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Install Rust
        run: |
          rustup override set stable
          rustup update stable
      - name: Install cargo-hack
        uses: taiki-e/install-action@cargo-hack
      - uses: Swatinem/rust-cache@v2
      - name: Check feature powerset
        run: cargo hack check --feature-powerset --no-dev-deps

  coverage:
    name: Coverage
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Install Rust
        run: |
          rustup override set stable
          rustup update stable
          rustup component add llvm-tools-preview
      - name: Install cargo-llvm-cov
        uses: taiki-e/install-action@cargo-llvm-cov
      - uses: Swatinem/rust-cache@v2
      - name: Generate coverage report
        run: cargo llvm-cov --all-features --lcov --output-path lcov.info
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v5
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          files: lcov.info
          fail_ci_if_error: true

  msrv:
    name: MSRV (1.88)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Install Rust 1.88
        run: |
          rustup override set 1.88
          rustup update 1.88
      - uses: Swatinem/rust-cache@v2
      - name: Check compilation
        run: cargo check --all-features

  deny:
    name: Cargo Deny
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: EmbarkStudios/cargo-deny-action@v2

  machete:
    name: Unused Dependencies
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Install Rust
        run: |
          rustup override set stable
          rustup update stable
      - uses: Swatinem/rust-cache@v2
      - name: Machete
        uses: bnjbvr/cargo-machete@7959c845782fed02ee69303126d4a12d64f1db18

  semver:
    name: Semver Check
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Install Rust
        run: |
          rustup override set stable
          rustup update stable
      - uses: Swatinem/rust-cache@v2
      - name: Install cargo-semver-checks
        uses: taiki-e/install-action@cargo-semver-checks
      - name: Check semver
        run: cargo semver-checks check-release

  minimal-versions:
    name: Minimal Versions
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Install Rust nightly
        run: |
          rustup toolchain install nightly
          rustup override set nightly
      - uses: Swatinem/rust-cache@v2
      - name: Generate minimal version lockfile
        run: cargo +nightly -Z minimal-versions update
      - name: Install Rust stable
        run: |
          rustup override set stable
          rustup update stable
      - name: Check with minimal versions
        run: cargo check --all-features --locked

  cross-platform:
    name: ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [windows-latest, macos-latest]
    steps:
      - uses: actions/checkout@v6
      - name: Install Rust
        run: |
          rustup override set stable
          rustup update stable
      - uses: Swatinem/rust-cache@v2
      - name: Check compilation
        run: cargo check --all-features
      - name: Run tests
        run: cargo test --all-features


  typos:
    name: Typos
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Install Rust
        run: |
          rustup override set stable
          rustup update stable
      - uses: taiki-e/cache-cargo-install-action@v3
        with:
          tool: typos-cli
      - name: Typos Check
        run: typos src/

  publish:
    name: Publish to crates.io
    runs-on: ubuntu-latest
    if: github.event_name == 'push'
    needs:
      - fmt
      - clippy
      - test
      - docs
      - feature-check
      - coverage
      - msrv
      - deny
      - machete
      - semver
      - minimal-versions
      - cross-platform
      - typos
    steps:
      - uses: actions/checkout@v6
      - name: Install Rust
        run: |
          rustup override set stable
          rustup update stable
      - uses: Swatinem/rust-cache@v2

      - name: Check if version already published
        id: check
        run: |
          CARGO_VERSION=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version')
          echo "version=$CARGO_VERSION" >> "$GITHUB_OUTPUT"

          HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" "https://crates.io/api/v1/crates/optimizer/$CARGO_VERSION")
          if [ "$HTTP_STATUS" = "200" ]; then
            echo "Version $CARGO_VERSION already exists on crates.io, skipping publish"
            echo "skip=true" >> "$GITHUB_OUTPUT"
          else
            echo "Version $CARGO_VERSION not found on crates.io, will publish"
            echo "skip=false" >> "$GITHUB_OUTPUT"
          fi

      - name: Publish
        if: steps.check.outputs.skip == 'false' && github.ref == 'refs/heads/master'
        run: cargo publish
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}