name: Rust

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

env:
  CARGO_TERM_COLOR: always

jobs:
  build-test-all-features:
    runs-on: ubicloud-standard-8
    permissions:
      contents: write
      pull-requests: write
      actions: read
      checks: write
      repository-projects: write

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - uses: Swatinem/rust-cache@v2
      with:
        cache-on-failure: "true"
        add-job-id-key: "false"
        add-rust-environment-hash-key: "false"

    - name: Install Rust
      uses: actions-rs/toolchain@v1
      with:
          toolchain: stable
          profile: minimal
          override: true

    - name: Install cargo-all-features
      run: cargo install cargo-all-features

    - name: Run tests for all feature combinations
      # This command builds/tests all combinations sequentially
      run: cargo all-features test -- --verbose


  clippy_check:

    runs-on: ubicloud-standard-8
    permissions:
      contents: write
      pull-requests: write
      actions: read
      checks: write
      repository-projects: write
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - uses: Swatinem/rust-cache@v2
        with:
            cache-on-failure: "true"
          add-job-id-key: "false"
          add-rust-environment-hash-key: "false"

      - name: Install Rust
        uses: actions-rs/toolchain@v1
        with:
            toolchain: stable
            profile: minimal
            components: clippy
            override: true
      - name: Install cargo-all-features
        run: cargo install cargo-all-features

      - name: Clippy check all feature combinations
        run: cargo all-features clippy --all-targets --all-features -- -D warnings

  format_check:

    runs-on: ubicloud-standard-8
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - uses: Swatinem/rust-cache@v2
        with:
            cache-on-failure: "true"
          add-job-id-key: "false"
          add-rust-environment-hash-key: "false"

      - name: Install Rust
        uses: actions-rs/toolchain@v1
        with:
            toolchain: stable
            profile: minimal
            components: rustfmt
            override: true
            
      - name: Check formatting
        run: cargo fmt --all -- --check

  security_audit:
    runs-on: ubicloud-standard-2
    steps:
      - uses: actions/checkout@v4
      - uses: rustsec/audit-check@v2
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
