name: Continuous Integration

on:
  workflow_call:
    inputs:
      runs_on:
        required: false
        type: string
        default: ubuntu-latest
      timeout_minutes:
        required: false
        type: number
        default: 15
    secrets:
      eth_rpc_url:
        required: true
      app_id:
        required: true
      app_private_key:
        required: true

permissions:
  id-token: write
  contents: read

env:
  CARGO_TERM_COLOR: always
  RPC_URL: ${{ secrets.eth_rpc_url }}

jobs:
  compile_and_test:
    name: Compile & Test
    runs-on: ${{ inputs.runs_on }}
    timeout-minutes: ${{ inputs.timeout_minutes }}
    strategy:
      matrix:
        toolchain:
          - stable
    steps:
      - name: Generate a token
        id: generate-token
        uses: getsentry/action-github-app-token@d4b5da6c5e37703f8c3b3e43abb5705b46e159cc
        with:
          app_id: ${{ secrets.app_id }}
          private_key: ${{ secrets.app_private_key }}

      - name: Install git
        run: sudo apt update && sudo apt install -y git

      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Setup git to use https
        run: |
          git config --global credential.helper store
          echo "https://${{ steps.generate-token.outputs.token }}@github.com" > ~/.git-credentials
          git config --global url."https://x-access-token:${{ steps.generate-token.outputs.token }}@github.com".insteadOf ssh://github.com

      - name: Setup toolchain
        id: toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: nightly
          components: rustfmt, clippy
          override: true

      - name: Setup Rust Cache
        uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6
        with:
          cache-on-failure: true

      - name: Install latest nextest release
        uses: taiki-e/install-action@b239071b2aedda3db20530301c2d88cd538e90d3

      - name: Test
        run: cargo nextest run --workspace --lib --all-targets && cargo test --doc

  lint:
    name: Code Lint
    runs-on: ${{ inputs.runs_on }}
    timeout-minutes: ${{ inputs.timeout_minutes }}
    steps:
      - name: Generate a token
        id: generate-token
        uses: getsentry/action-github-app-token@d4b5da6c5e37703f8c3b3e43abb5705b46e159cc
        with:
          app_id: ${{ secrets.app_id }}
          private_key: ${{ secrets.app_private_key }}

      - name: Install git
        run: sudo apt update && sudo apt install -y git

      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Setup git to use https
        run: |
          git config --global credential.helper store
          echo "https://${{ steps.generate-token.outputs.token }}@github.com" > ~/.git-credentials
          git config --global url."https://x-access-token:${{ steps.generate-token.outputs.token }}@github.com".insteadOf ssh://github.com

      - name: Setup toolchain
        id: toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: nightly
          components: rustfmt, clippy
          override: true
      - name: Setup Rust Cache
        uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: true

      - name: Clippy
        run: cargo clippy --workspace --all-targets --all-features

      - name: Rustfmt
        run: cargo fmt --all --check
