name: Rust

on:
  pull_request:
  push: # Run CI on the main branch after every merge. This is important to fill the GitHub Actions cache in a way that pull requests can see it
    branches:
      - main

env:
  CARGO_TERM_COLOR: always

jobs:
  valence-fmt-clippy:
    strategy:
      fail-fast: true
      matrix:
        platform: [windows-latest, macos-latest, ubuntu-latest]
        style: [default]
        rust:
          - stable
        include:
          - style: default
            flags: ""

    runs-on: ${{ matrix.platform }}

    steps:
      - uses: actions/checkout@v3

      - name: Setup Rust toolchain and cache
        uses: actions-rust-lang/setup-rust-toolchain@v1.4.4
        with:
          toolchain: "stable"
          components: "clippy, rustfmt"

      - name: "Copy playground"
        run: cp tools/playground/src/playground.template.rs tools/playground/src/playground.rs

      - name: Install Dependencies (Linux)
        run: sudo apt-get update && sudo apt-get install -y libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev libclang-dev libgtk-3-dev
        if: matrix.platform == 'ubuntu-latest'

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

      - name: Clippy
        run: cargo clippy --workspace ${{ matrix.flags }}--no-deps --all-features --all-targets -- -D warnings

  valence-tests:
    strategy:
      fail-fast: true
      matrix:
        platform: [windows-latest, macos-latest, ubuntu-latest]
        style: [default]
        rust:
          - stable
        include:
          - style: default
            flags: ""

    runs-on: ${{ matrix.platform }}

    steps:
      - uses: actions/checkout@v3

      - name: Setup Rust toolchain and cache
        uses: actions-rust-lang/setup-rust-toolchain@v1.4.4

      - name: "Copy playground"
        run: cp tools/playground/src/playground.template.rs tools/playground/src/playground.rs

      - name: Install Dependencies (Linux)
        run: sudo apt-get update && sudo apt-get install -y libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev libclang-dev libgtk-3-dev
        if: matrix.platform == 'ubuntu-latest'

      - name: Run tests
        run: cargo test --workspace ${{ matrix.flags }}--all-features --all-targets

      - name: Run valence_nbt tests without preserve_order feature
        run: cargo test -p valence_nbt --all-targets

  valence-docs:
    strategy:
      fail-fast: true
      matrix:
        platform: [windows-latest, macos-latest, ubuntu-latest]
        style: [default]
        rust:
          - stable
        include:
          - style: default
            flags: ""

    runs-on: ${{ matrix.platform }}

    steps:
      - uses: actions/checkout@v3

      - name: Setup Rust toolchain and cache
        uses: actions-rust-lang/setup-rust-toolchain@v1.4.4

      - name: "Copy playground"
        run: cp tools/playground/src/playground.template.rs tools/playground/src/playground.rs

      - name: Install Dependencies (Linux)
        run: sudo apt-get update && sudo apt-get install -y libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev libclang-dev libgtk-3-dev
        if: matrix.platform == 'ubuntu-latest'

      - name: Validate documentation
        run: cargo doc --workspace ${{ matrix.flags }}--no-deps --all-features --document-private-items