name: CI
permissions:
  contents: read
on:
  pull_request:
    paths-ignore:
      - README.md
  push:
    branches: main
    paths-ignore:
      - README.md

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        rust:
          - stable
          - beta
          - nightly-2024-09-01
    steps:
      - uses: actions/checkout@629c2de402a417ea7690ca6ce3f33229e27606a5 # v2
      - uses: actions-rs/toolchain@63eb9591781c46a70274cb3ebdf190fce92702e8 # v1
        with:
          profile: minimal
          toolchain: ${{ matrix.rust }}
          components: rustfmt
          override: true
      - run: rustc --version
      - run: cargo build --release --workspace
      - run: (cd core && cargo build --features=json --release --all-targets)

  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        rust:
          - stable
          - beta
          - nightly-2024-09-01
    steps:
      - uses: actions/checkout@629c2de402a417ea7690ca6ce3f33229e27606a5 # v2
        with:
          submodules: true
      - uses: actions-rs/toolchain@63eb9591781c46a70274cb3ebdf190fce92702e8 # v1
        with:
          profile: minimal
          toolchain: ${{ matrix.rust }}
          components: rustfmt
          override: true
      - run: rustc --version
      - run: cargo test --all -- --nocapture

  check32b:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        rust:
          - stable
          - beta
          - nightly-2024-09-01
    steps:
      - uses: actions/checkout@629c2de402a417ea7690ca6ce3f33229e27606a5 # v2
        with:
          submodules: true
      - uses: actions-rs/toolchain@63eb9591781c46a70274cb3ebdf190fce92702e8 # v1
        with:
          profile: minimal
          toolchain: ${{ matrix.rust }}
          components: rustfmt
          target: i686-unknown-linux-gnu
          override: true
      - run: for dir in proto core prf mac aead daead streaming signature hybrid; do cargo build --target=i686-unknown-linux-gnu --manifest-path=$dir/Cargo.toml; done

  msrv:
    name: Rust ${{matrix.rust}}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        rust: [1.71.1, 1.72.0]
    steps:
      - uses: actions/checkout@629c2de402a417ea7690ca6ce3f33229e27606a5 # v2
        with:
          submodules: true
      - uses: actions-rs/toolchain@63eb9591781c46a70274cb3ebdf190fce92702e8 # v1
        with:
          profile: minimal
          toolchain: ${{ matrix.rust }}
          components: rustfmt
          override: true
      - run: rustc --version
      - run: cargo build --release --workspace --all-features

  formatting:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@629c2de402a417ea7690ca6ce3f33229e27606a5 # v2
      - uses: actions/setup-go@f6164bd8c8acb4a71fb2791a8b6c4024ff038dab # v3
      - run: go install github.com/campoy/embedmd@v1.0.0
      - uses: ruby/setup-ruby@c04af2bb7258bb6a03df1d3c1865998ac9390972 # v1.194.0
        with:
            ruby-version: '2.7'
            bundler-cache: true
      - run: gem install mdl
      - uses: actions-rs/toolchain@63eb9591781c46a70274cb3ebdf190fce92702e8 # v1
        with:
          profile: minimal
          toolchain: nightly-2024-09-01
          override: true
          components: rustfmt
      - run: rustc --version
      - run: cargo fmt --all -- --check
      - run: PATH=$PATH:$HOME/go/bin scripts/check-format.sh

  regen:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@629c2de402a417ea7690ca6ce3f33229e27606a5 # v2
      - uses: actions-rs/toolchain@63eb9591781c46a70274cb3ebdf190fce92702e8 # v1
        with:
          profile: minimal
          toolchain: stable
          components: rustfmt
      - run: sudo apt-get install -y protobuf-compiler
      - run: export PROTOC=/usr/bin/protoc && cargo build --workspace --all-features
        # Check that regeneration of code produces exactly what's checked in
      - run: git diff --exit-code -- .

  bench:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@629c2de402a417ea7690ca6ce3f33229e27606a5 # v2
      - uses: actions-rs/toolchain@63eb9591781c46a70274cb3ebdf190fce92702e8 # v1
        with:
          profile: minimal
          toolchain: nightly-2024-09-01
          override: true
          components: rustfmt
      - run: cargo bench --all-targets

  clippy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@629c2de402a417ea7690ca6ce3f33229e27606a5 # v2
      - uses: actions-rs/toolchain@63eb9591781c46a70274cb3ebdf190fce92702e8 # v1
        with:
          profile: minimal
          toolchain: nightly-2024-09-01
          override: true
          components: rustfmt, clippy
      - run: rustc --version
      - run: cargo clippy --all-features --all-targets -- -Dwarnings

  doc:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@629c2de402a417ea7690ca6ce3f33229e27606a5 # v2
      - uses: actions-rs/toolchain@63eb9591781c46a70274cb3ebdf190fce92702e8 # v1
        with:
          profile: minimal
          toolchain: stable
      - run: rustc --version
      - run: cargo doc --no-deps --document-private-items --all-features

  udeps:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@629c2de402a417ea7690ca6ce3f33229e27606a5 # v2
      - uses: actions-rs/toolchain@63eb9591781c46a70274cb3ebdf190fce92702e8 # v1
        with:
          profile: minimal
          toolchain: nightly-2024-09-01
          override: true
          components: rustfmt
      - uses: actions-rs/install@69ec87709ffb5b19a7b5ddbf610cb221498bb1eb # v0.1.2
        with:
          crate: cargo-udeps
          use-tool-cache: true
          locked: true
          version: 0.1.50
      - run: cargo udeps

  deny:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@629c2de402a417ea7690ca6ce3f33229e27606a5 # v2
      - uses: actions-rs/toolchain@63eb9591781c46a70274cb3ebdf190fce92702e8 # v1
        with:
          profile: minimal
          toolchain: stable
          override: true
          components: rustfmt
      - run: cargo install --locked --version 0.16.1 cargo-deny
      - run: cargo deny --version
      - run: cargo deny check

  coverage:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@629c2de402a417ea7690ca6ce3f33229e27606a5 # v2
        with:
          submodules: true
          fetch-depth: 0
      - uses: actions-rs/toolchain@63eb9591781c46a70274cb3ebdf190fce92702e8 # v1
        with:
          profile: minimal
          toolchain: 1.74.0
          override: true
          components: rustfmt
      - uses: actions-rs/install@69ec87709ffb5b19a7b5ddbf610cb221498bb1eb # v0.1.2
        with:
          crate: cargo-tarpaulin
          use-tool-cache: true
          version: 0.27.3
      - run: cargo tarpaulin --verbose --ignore-tests --all-features --timeout=600 --out xml
      - name: Upload to codecov.io
        run: |
          bash <(curl -s https://codecov.io/bash)