name: Build

on:
  push:
    branches:
      - main
      - master
  pull_request: {}

env:
  RUST_MSRV: 1.61.0

jobs:
  msrv:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/cache@v1
        with:
          path: |
            ~/.cargo/bin
            ~/.cargo/registry/index
            ~/.cargo/registry/cache
            ~/.cargo/git/db/
            target
          key: "${{ runner.os }}-cargo-build-msrv-${{ hashFiles('**/Cargo.lock') }}"
      - uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: ${{ env.RUST_MSRV }}
          override: true
      - uses: actions-rs/cargo@v1
        with:
          command: check

  # typical build with various feature combinations
  build:
    name: Build
    runs-on: ${{ matrix.os }}
    continue-on-error: ${{ matrix.experimental }}
    strategy:
      matrix:
        os: [ubuntu-latest]
        flags:
          - ""
          - "--features debugging"
          - "--features metadata,serde,internals"
          - "--features unchecked,serde,metadata,internals,debugging"
          - "--features sync,serde,metadata,internals,debugging"
          - "--features no_position,serde,metadata,internals,debugging"
          - "--features no_optimize,serde,metadata,internals,debugging"
          - "--features no_float,serde,metadata,internals,debugging"
          - "--features f32_float,serde,metadata,internals,debugging"
          - "--features decimal,serde,metadata,internals,debugging"
          - "--features no_custom_syntax,serde,metadata,internals,debugging"
          - "--features no_float,decimal"
          - "--tests --features only_i32,serde,metadata,internals,debugging"
          - "--features only_i64,serde,metadata,internals,debugging"
          - "--features no_index,serde,metadata,internals,debugging"
          - "--features no_object,serde,metadata,internals,debugging"
          - "--features no_function,serde,metadata,internals,debugging"
          - "--features no_module,serde,metadata,internals,debugging"
          - "--features no_time,serde,metadata,internals,debugging"
          - "--features no_closure,serde,metadata,internals,debugging"
          - "--features unicode-xid-ident,serde,metadata,internals,debugging"
          - "--features sync,no_time,no_function,no_float,no_position,no_optimize,no_module,no_closure,no_custom_syntax,metadata,serde,unchecked,debugging"
          - "--features no_time,no_function,no_float,no_position,no_index,no_object,no_optimize,no_module,no_closure,no_custom_syntax,unchecked"
        toolchain: [stable]
        experimental: [false]
        include:
          # smoketests for different toolchains
          - {toolchain: stable, os: windows-latest, experimental: false, flags: ""}
          - {toolchain: stable, os: macos-latest, experimental: false, flags: ""}
          - {toolchain: beta, os: ubuntu-latest, experimental: false, flags: ""}
          - {toolchain: nightly, os: ubuntu-latest, experimental: true, flags: ""}
      fail-fast: false
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Setup Toolchain
      uses: actions-rs/toolchain@v1
      with:
        toolchain: ${{matrix.toolchain}}
        override: true
    - name: Test
      uses: actions-rs/cargo@v1
      with:
        command: test
        args: ${{matrix.flags}}

  feature_powerset:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - uses: actions-rs/toolchain@v1
      with:
        toolchain: stable
        override: true
    - uses: taiki-e/install-action@v2
      with:
        tool: cargo-hack@0.5.25
    - run: cargo hack check --feature-powerset --depth 2 --no-dev-deps --exclude-features "stdweb wasm-bindgen f32_float"

  # no-std builds are a bit more extensive to test
  no_std_build:
    name: NoStdBuild
    runs-on: ${{matrix.os}}
    continue-on-error: ${{matrix.experimental}}
    strategy:
      matrix:
        include:
          - {os: ubuntu-latest, flags: "--profile unix", experimental: false}
          - {os: windows-latest, flags: "--profile windows", experimental: true}
          - {os: macos-latest, flags: "--profile macos", experimental: false}
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Setup Toolchain
      uses: actions-rs/toolchain@v1
      with:
        toolchain: nightly
        override: true
    - name: Build Project
      uses: actions-rs/cargo@v1
      with:
        command: build
        args: --manifest-path=no_std/no_std_test/Cargo.toml ${{matrix.flags}}

  wasm:
    name: Check Wasm build
    runs-on: ubuntu-latest
    strategy:
      matrix:
        flags:
          - "--target wasm32-wasi"
# These fail currently, future PR should fix them
#          - "--target wasm32-unknown-unknown"
#          - "--target wasm32-unknown-unknown --features wasm-bindgen"
          - "--target wasm32-unknown-unknown --no-default-features"
          - "--target wasm32-unknown-unknown --no-default-features --features wasm-bindgen"
      fail-fast: false
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Setup Generic Wasm Toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          override: true
          target: wasm32-unknown-unknown
      - name: Setup Wasi Toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          override: true
          target: wasm32-wasi
      - name: Build
        uses: actions-rs/cargo@v1
        with:
          command: build
          args: ${{matrix.flags}}

  rustfmt:
    name: Check Formatting
    runs-on: windows-latest
    continue-on-error: true
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Setup Toolchain
      uses: actions-rs/toolchain@v1
      with:
        toolchain: nightly
        override: true
        components: rustfmt, clippy
    - name: Run Rustfmt
      uses: actions-rs/cargo@v1
      with:
        command: fmt
        args: --all -- --check
    - name: Run Clippy
      uses: actions-rs/cargo@v1
      with:
        command: clippy
        args: --all -- -Aclippy::all -Dclippy::perf

  codegen_build:
    name: Codegen Build
    runs-on: ${{matrix.os}}
    continue-on-error: ${{matrix.experimental}}
    strategy:
      matrix:
        include:
          - {toolchain: stable, os: ubuntu-latest, experimental: false, flags: "--features metadata"}
          - {toolchain: stable, os: windows-latest, experimental: false, flags: "--features metadata"}
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Setup Toolchain
      uses: actions-rs/toolchain@v1
      with:
        toolchain: ${{matrix.toolchain}}
        override: true
    - name: Build Project
      uses: actions-rs/cargo@v1
      with:
        command: test
        args: --manifest-path=codegen/Cargo.toml ${{matrix.flags}}