roadster 0.8.1

A "Batteries Included" web framework for rust designed to get you moving fast.
Documentation
name: Checks

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

env:
  CARGO_TERM_COLOR: always

# https://stackoverflow.com/a/72408109
concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

jobs:
  test-examples:
    name: Test examples
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres:15.3-alpine
        ports:
          - 5432:5432
        env:
          POSTGRES_DB: example_dev
          POSTGRES_PASSWORD: roadster
          POSTGRES_USER: roadster
        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
      redis:
        image: redis:7.2-alpine
        ports:
          - 6379:6379
        options: --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5
      smtp:
        image: axllent/mailpit:v1.21
        ports:
          - 8025:8025
          - 1025:1025
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - uses: rui314/setup-mold@7344740a9418dcdcb481c7df83d9fbd1d5072d7d
      - uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6
      # protoc is needed to build examples that have grpc enabled
      - uses: taiki-e/install-action@d31232495ad76f47aad66e3501e47780b49f0f3e
        with:
          tool: just,protoc
      - name: Test
        run: just test-examples

  test-private:
    name: Test private
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - uses: rui314/setup-mold@7344740a9418dcdcb481c7df83d9fbd1d5072d7d
      - uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6
      - uses: taiki-e/install-action@d31232495ad76f47aad66e3501e47780b49f0f3e
        with:
          tool: just

      - name: Test
        run: just test-private

  test-bench:
    name: Test benches
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - uses: rui314/setup-mold@7344740a9418dcdcb481c7df83d9fbd1d5072d7d
      - uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6
      - uses: taiki-e/install-action@d31232495ad76f47aad66e3501e47780b49f0f3e
        with:
          tool: just

      - name: Test
        run: just test-bench

  generate_feature_matrix:
    runs-on: ubuntu-latest
    outputs:
      data: ${{ steps.build_data.outputs.data }}
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - name: Build powerset data
        id: build_data
        run: |
          cd private/powerset_matrix
          echo "data=$(cargo run -- -d 1 -s 8 -f json)" >> "$GITHUB_OUTPUT"

  test_matrix:
    needs: generate_feature_matrix
    runs-on: ubuntu-latest
    strategy:
      max-parallel: 10
      matrix:
        index: ${{ fromJson(needs.generate_feature_matrix.outputs.data).indexes }}
    env:
      features: ${{ join(fromJson(needs.generate_feature_matrix.outputs.data).powersets[ matrix.index ], ' ') }}
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - uses: rui314/setup-mold@7344740a9418dcdcb481c7df83d9fbd1d5072d7d
      - uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6
      - uses: taiki-e/install-action@d31232495ad76f47aad66e3501e47780b49f0f3e
        with:
          tool: cargo-hack,nextest
      - name: Test
        run: |
          features=($features)
          length=${#features[@]}
          i=1
          for feature_list in "${features[@]}"; do
            echo "::group::[$i/$length]: cargo nextest run --no-fail-fast --no-default-features --features $feature_list"
            cargo nextest run --no-fail-fast --no-default-features --features "$feature_list"
            echo "::endgroup::"
            echo "::group::[$i/$length]: cargo test --doc --no-fail-fast --no-default-features --features $feature_list"
            cargo test --doc --no-fail-fast --no-default-features --features "$feature_list"
            cargo clean -p roadster
            i=$(expr $i + 1)
            echo "::endgroup::"
          done

  test:
    name: Tests
    needs: test_matrix
    runs-on: ubuntu-latest
    steps:
      - run: echo Success

  doc_test:
    name: Doc tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - uses: rui314/setup-mold@7344740a9418dcdcb481c7df83d9fbd1d5072d7d
      - uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6
      - uses: taiki-e/install-action@d31232495ad76f47aad66e3501e47780b49f0f3e
        with:
          tool: cargo-hack

      - name: Doc test
        run: cargo hack test --doc --no-fail-fast --each-feature --log-group github-actions

  check:
    name: Check
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - uses: rui314/setup-mold@7344740a9418dcdcb481c7df83d9fbd1d5072d7d
      - uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6
      - uses: taiki-e/install-action@d31232495ad76f47aad66e3501e47780b49f0f3e
        with:
          tool: cargo-hack

      - name: Check
        run: cargo hack check --each-feature --no-dev-deps --log-group github-actions

  clippy_matrix:
    needs: generate_feature_matrix
    runs-on: ubuntu-latest
    strategy:
      max-parallel: 10
      matrix:
        index: ${{ fromJson(needs.generate_feature_matrix.outputs.data).indexes }}
    env:
      features: ${{ join(fromJson(needs.generate_feature_matrix.outputs.data).powersets[ matrix.index ], ' ') }}
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - uses: rui314/setup-mold@7344740a9418dcdcb481c7df83d9fbd1d5072d7d
      - uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6
      - uses: taiki-e/install-action@d31232495ad76f47aad66e3501e47780b49f0f3e
        with:
          tool: cargo-hack

      - name: Clippy
        run: |
          features=($features)
          length=${#features[@]}
          i=1
          for feature_list in "${features[@]}"; do
            echo "::group::[$i/$length]: cargo clippy --no-default-features --features $feature_list -- -D warnings"
            cargo clippy --no-default-features --features "$feature_list" -- -D warnings
            cargo clean -p roadster
            i=$(expr $i + 1)
            echo "::endgroup::"
          done

  clippy:
    name: Clippy
    needs: clippy_matrix
    runs-on: ubuntu-latest
    steps:
      - run: echo Success

  deny:
    name: Deny
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - uses: EmbarkStudios/cargo-deny-action@34899fc7ba81ca6268d5947a7a16b4649013fea1
        with:
          command: check
          arguments: --all-features
          command-arguments: "-A duplicate advisories ban sources"

  # https://doc.rust-lang.org/cargo/guide/continuous-integration.html#verifying-rust-version
  msrv:
    name: Check MSRV
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - uses: rui314/setup-mold@7344740a9418dcdcb481c7df83d9fbd1d5072d7d
      - uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6
      - uses: taiki-e/install-action@d31232495ad76f47aad66e3501e47780b49f0f3e
        with:
          tool: cargo-hack

      - run: cargo hack check --rust-version --all-targets --ignore-private --log-group github-actions

  # https://doc.rust-lang.org/cargo/guide/continuous-integration.html#verifying-rust-version
  minimal_direct_deps:
    name: Direct dep min version check
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - uses: rui314/setup-mold@7344740a9418dcdcb481c7df83d9fbd1d5072d7d
      - uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6
      - uses: taiki-e/install-action@d31232495ad76f47aad66e3501e47780b49f0f3e
        with:
          tool: cargo-hack,cargo-minimal-versions
      - run: cargo minimal-versions check --direct --all-features

  check_formatting:
    name: Formatting
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6
      - name: Formatting
        run: cargo fmt --all --check

  check_docs:
    name: Docs
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6
      - uses: taiki-e/install-action@d31232495ad76f47aad66e3501e47780b49f0f3e
        with:
          tool: just,cargo-hack
      - name: Install zsh
        run: sudo apt install -y zsh
      - name: Docs all features
        # Our justfile requires zsh
        shell: zsh {0}
        run: just check-docs
      - name: Docs each feature
        env:
          RUSTDOCFLAGS: "-D rustdoc::all -A rustdoc::private_intra_doc_links"
        run: cargo hack doc --ignore-private --log-group github-actions --each-feature --no-deps