serde_tuple 1.1.3

De/serialize structs with named fields as array of values
Documentation
name: CI

on:
  push:
    branches: [ main, master ]
  pull_request:
    branches: [ main, master ]
  release:
    types: [ published ]
  workflow_dispatch:

defaults:
  run:
    shell: bash

jobs:
  test:
    name: Test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - if: github.event_name != 'release' && github.event_name != 'workflow_dispatch'
        uses: Swatinem/rust-cache@v2
      - uses: taiki-e/install-action@v2
        with: { tool: just }
      - if: github.event_name == 'release'
        name: Ensure this crate has not yet been published (on release)
        run: just check-if-published
      - run: just ci-test
      # Enable this once the new version is published. Without it, the action will always fail.
      # - name: Check semver
      #   uses: obi1kenobi/cargo-semver-checks-action@v2

  test-msrv:
    name: Test MSRV
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - if: github.event_name != 'release' && github.event_name != 'workflow_dispatch'
        uses: Swatinem/rust-cache@v2
      - uses: taiki-e/install-action@v2
        with: { tool: just }
      - name: Read MSRV
        id: msrv
        run: echo "value=$(just get-msrv)" >> $GITHUB_OUTPUT
      - name: Install MSRV Rust ${{ steps.msrv.outputs.value }}
        uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: ${{ steps.msrv.outputs.value }}
      - run: just ci_mode=0 ci-test-msrv  # Ignore warnings in MSRV

  coverage:
    name: Code Coverage
    if: github.event_name != 'release'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: Swatinem/rust-cache@v2
      - uses: taiki-e/install-action@v2
        with: { tool: 'just,cargo-llvm-cov' }
      - name: Generate code coverage
        run: just ci-coverage
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v5
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          files: target/llvm-cov/codecov.info
          fail_ci_if_error: true

  # This job checks if any of the previous jobs failed or were canceled.
  # This approach also allows some jobs to be skipped if they are not needed.
  ci-passed:
    if: always()
    needs: [ test, test-msrv ]
    runs-on: ubuntu-latest
    steps:
      - if: ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }}
        run: exit 1

  release:
    # Some dependencies of the `ci-passed` job might be skipped, but we still want to run if the `ci-passed` job succeeded.
    if: always() && startsWith(github.ref, 'refs/tags/') && needs.ci-passed.result == 'success'
    name: Publish to crates.io
    needs: [ ci-passed ]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Publish to crates.io
        run: cargo publish
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}