name: rustup
author: David Tolnay
description: Install the Rust toolchain

inputs:
  toolchain:
    description: Rust toolchain specification -- see https://rust-lang.github.io/rustup/concepts/toolchains.html#toolchain-specification
    required: true
  target:
    description: Target triple to install for this toolchain
    required: false
  components:
    description: Comma-separated list of components to be additionally installed
    required: false

outputs:
  version:
    description: Version as reported by `rustc --version`
    value: ${{steps.rustc-version.outputs.version}}

runs:
  using: composite
  steps:
    - id: flags
      run: |
        : construct rustup command line
        echo "::set-output name=targets::$(for t in ${targets//,/ }; do echo -n ' --target' $t; done)"
        echo "::set-output name=components::$(for c in ${components//,/ }; do echo -n ' --component' $c; done)"
        echo "::set-output name=downgrade::${{inputs.toolchain == 'nightly' && inputs.components && ' --allow-downgrade' || ''}}"
      env:
        targets: ${{inputs.target}}
        components: ${{inputs.components}}
      shell: bash
    - name: "Install rustup if needed"
      run: |
        if ! command -v rustup &> /dev/null ; then
          curl --proto '=https' --tlsv1.2 --retry 10 --retry-connrefused -fsSL "https://sh.rustup.rs" | sh -s -- --default-toolchain none -y
          echo "${CARGO_HOME:-~/.cargo}/bin" >> $GITHUB_PATH
        fi
      if: runner.os != 'Windows'
      shell: bash
    - name: rustup toolchain install ${{inputs.toolchain}}
      run: rustup toolchain install ${{inputs.toolchain}}${{steps.flags.outputs.targets}}${{steps.flags.outputs.components}} --profile minimal${{steps.flags.outputs.downgrade}} --no-self-update
      shell: bash
    - run: rustup default ${{inputs.toolchain}}
      shell: bash
    - id: rustc-version
      run: echo "::set-output name=version::$(rustc --version)"
      shell: bash
    - run: rustc --version
      shell: bash