name: CI

on: [push, pull_request]

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - name: Checkout sources
        uses: actions/checkout@v3
      - name: Install toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: nightly
          components: rustfmt,clippy
      - name: Setup cache
        uses: Swatinem/rust-cache@v2
      - name: Rustfmt
        run: cargo +nightly fmt --all -- --check
      - name: Clippy
        run: cargo clippy --features full-doc

  test:
    name: Test
    runs-on: ${{ matrix.os || 'ubuntu-latest' }}
    strategy:
      fail-fast: false
      matrix:
        name:
          - stable
          - beta
          - nightly
          - macOS
          - Windows
          - driver only
          - gateway only
          - simd json
        include:
          - name: beta
            toolchain: beta
          - name: nightly
            toolchain: nightly
          - name: macOS
            os: macOS-latest
            dont-test: true
          - name: Windows
            os: windows-latest
            dont-test: true
          - name: driver only
            features: driver rustls
            dont-test: true
          - name: gateway only
            features: gateway serenity rustls
            dont-test: true
          - name: simd json
            features: simd-json serenity rustls driver gateway serenity?/simd_json
            rustflags: -C target-cpu=native
            dont-test: true
    steps:
      - name: Checkout sources
        uses: actions/checkout@v3
      - name: Install toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.toolchain || 'stable' }}
      - name: Setup cache
        uses: Swatinem/rust-cache@v2
      - name: Install dependencies
        if: runner.os == 'Linux'
        run: |
          sudo apt-get update
      - name: Install yt-dlp (Unix)
        if: runner.os != 'Windows'
        run: |
          sudo wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -O /usr/local/bin/yt-dlp
          sudo chmod a+rx /usr/local/bin/yt-dlp
      - name: Install yt-dlp (Windows)
        if: runner.os == 'Windows'
        run: choco install yt-dlp
      - name: Set RUSTFLAGS
        if: runner.os != 'Windows'
        run: echo "RUSTFLAGS=${{ matrix.rustflags || '' }}" >> $GITHUB_ENV
      - name: Build all features
        if: matrix.features == ''
        run: cargo build --features full-doc
      - name: Test all features
        if: ${{ !matrix.dont-test && matrix.features == '' }}
        run: cargo test --features full-doc
      - name: Build some features
        if: matrix.features
        run: cargo build --no-default-features --features "${{ matrix.features }}"
      - name: Test some features
        if: ${{ !matrix.dont-test && matrix.features }}
        run: cargo test --no-default-features --features "${{ matrix.features }}"

  doc:
    name: Build docs
    runs-on: ubuntu-latest
    steps:
      - name: Checkout sources
        uses: actions/checkout@v3
      - name: Install toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: nightly
      - name: Setup cache
        uses: Swatinem/rust-cache@v2
      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y libopus-dev
      - name: Build docs
        env:
          RUSTDOCFLAGS: -D broken_intra_doc_links
        run: |
          cargo doc --no-deps --features full-doc

  examples:
    name: Examples
    runs-on: ubuntu-latest
    steps:
      - name: Checkout sources
        uses: actions/checkout@v3
      - name: Install toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          workspaces: examples
      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y libopus-dev

      - name: Build serenity/voice
        working-directory: examples
        run: cargo build -p voice
      - name: Build serenity/voice_events_queue
        working-directory: examples
        run: cargo build -p voice_events_queue
      - name: Build serenity/voice_receive
        working-directory: examples
        run: cargo build -p voice_receive
      - name: Build serenity/voice_cached_audio
        working-directory: examples
        run: cargo build -p voice_cached_audio
      - name: Build twilight
        working-directory: examples
        run: cargo build -p twilight
