name: CI

on: [push, pull_request]

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-latest

    steps:
    - name: Checkout sources
      uses: actions/checkout@v2
    - name: Install toolchain
      uses: actions-rs/toolchain@v1
      with:
        toolchain: nightly
        components: rustfmt, clippy
        override: true
    - name: Rustfmt
      run: cargo +nightly fmt --all -- --check
    - name: Clippy
      uses: actions-rs/clippy-check@v1
      with:
        token: ${{ secrets.GITHUB_TOKEN }}
        args: --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
          - legacy tokio

        include:
          - name: beta
            toolchain: beta
          - name: nightly
            toolchain: nightly
          - name: macOS
            os: macOS-latest
          - name: Windows
            os: windows-latest
          - name: driver only
            features: driver rustls
            dont-test: true
          - name: gateway only
            features: serenity-rustls
            dont-test: true
          - name: legacy tokio
            features: serenity-rustls-tokio-02 driver-tokio-02
            dont-test: true

    steps:
      - name: Checkout sources
        uses: actions/checkout@v2

      - name: Install toolchain
        id: tc
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.toolchain || 'stable' }}
          profile: minimal
          override: true

      - name: Install dependencies
        if: runner.os == 'Linux'
        run: |
          sudo apt-get update
          sudo apt-get install -y libopus-dev

      - name: Setup cache
        if: runner.os != 'macOS'
        uses: actions/cache@v2
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-test-${{ steps.tc.outputs.rustc_hash }}-${{ hashFiles('**/Cargo.toml') }}

      - name: Build all features
        if: matrix.features == ''
        run: cargo build --features full-doc

      - name: Test all features
        if: 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@v2

      - name: Install toolchain
        id: tc
        uses: actions-rs/toolchain@v1
        with:
          toolchain: nightly
          profile: minimal
          override: true

      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y libopus-dev

      - name: Setup cache
        uses: actions/cache@v2
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: ${{ runner.os }}-docs-${{ steps.tc.outputs.rustc_hash }}-${{ hashFiles('**/Cargo.toml') }}

      - 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@v2

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

      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y libopus-dev

      - name: Setup cache
        uses: actions/cache@v2
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            examples/target
          key: ${{ runner.os }}-examples-${{ steps.tc.outputs.rustc_hash }}-${{ hashFiles('**/Cargo.toml') }}

      - 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_storage'
        working-directory: examples
        run: cargo build -p voice_storage
      - name: 'Build twilight'
        working-directory: examples
        run: cargo build -p twilight
