# name of the workflow.
# this is optional.
name: Rust Checking and Testing

# events that will trigger this workflow.
# here, we only have "pull_request", so the workflow will run
# whenever we create a pull request.
# other examples: [push] and [pull_request, push]
on:
  # push:
  #   branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

env:
  CARGO_TERM_COLOR: always

# each workflow must have at least one job.
# jobs run in parallel by default (we can change that).
# each job groups together a series of steps to accomplish a purpose.
jobs:
  # name of the job
  check-code:
    # the platform or OS that the workflow will run on.
    runs-on: ubuntu-latest
 
    # series of steps to finish the job.
    steps:
    # name of the step.
    # steps run sequentially.
    # this is optionale
    - name: checkout
      # each step can either have "uses" or "run".
      # "uses" run an action written somewhere other than this workflow .
      # usually from the community.
      # this action checks out the repo code to the runner (instance)
      # running the action
      uses: actions/checkout@v4
    
    # another step.
    # Step 1: Run cargo check and fail if it fails
    - name: Check
      run: cargo check --verbose

  # name of the job
  test:
    
    # the platform or OS that the workflow will run on.
    runs-on: ubuntu-latest
    
    # Ensures this job runs only if check-code succeeds
    needs: check-code  
 
    # series of steps to finish the job.
    steps:
    # name of the step.
    # steps run sequentially.
    # this is optionale
    - name: checkout
      # each step can either have "uses" or "run".
      # "uses" run an action written somewhere other than this workflow .
      # usually from the community.
      # this action checks out the repo code to the runner (instance)
      # running the action
      uses: actions/checkout@v4

    # Step 2: Run unit and integration tests (excluding documentation tests)
    - name: Run Tests
      run: cargo test --tests --verbose

  # name of the job
  documentation-check:
    
    # the platform or OS that the workflow will run on.
    runs-on: ubuntu-latest
    
    # Ensures this job runs only if check-code succeeds
    needs: check-code 

    # series of steps to finish the job.
    steps:
    # name of the step.
    # steps run sequentially.
    # this is optionale
    - name: checkout
      # each step can either have "uses" or "run".
      # "uses" run an action written somewhere other than this workflow .
      # usually from the community.
      # this action checks out the repo code to the runner (instance)
      # running the action
      uses: actions/checkout@v4
    
    # Step 3: Check if documentation tests were run
    - name: Check for Documentation Tests
      run: |
        DOC_TESTS=$(cargo test --doc --verbose)
        if [[ ! "$DOC_TESTS" =~ "running" ]]; then
          echo "No documentation tests were run!" && exit 1
        fi