#!/usr/bin/env bash
# Bail on first error
set -e
# Bail if an unset variable is encountered
set -u
# Enable debugging output
set -x
# Give a pipeline a non-zero exit code if one of its constituents fails
set -o pipefail

function llvm_linux_target_triple() {
  echo "x86_64-linux-gnu-ubuntu-16.04"
}

function llvm_macos_target_triple() {
  case "$1" in
    [0-8].* | 9.0.0)    echo "x86_64-darwin-apple" ;;
    # Starting with 9.0.1, triple swapped ordering
    *)                  echo "x86_64-apple-darwin" ;;
  esac
}

function llvm_version_triple() {
  case "$1" in
    5.0) echo "5.0.1" ;;
    # By default, take the .0 patch release
    *)   echo "$1.0"  ;;
  esac
}

function llvm_base_url() {
  local llvm_version_triple=$1

  case "$llvm_version_triple" in
    [0-8].* | 9.0.0)
      echo "http://releases.llvm.org/$llvm_version_triple"
      ;;
    # Starting with 9.0.1, releases are hosted on github
    *)
      echo "https://github.com/llvm/llvm-project/releases/download/llvmorg-$llvm_version_triple"
      ;;
  esac
}

function llvm_download() {
  local base_url=$1
  local arch=$2

  export LLVM=clang+llvm-${LLVM_VERSION_TRIPLE}-$arch
  export LLVM_DIRECTORY="$HOME/.llvm/${LLVM}"

  if [ -d "${LLVM_DIRECTORY}" ]; then
    echo "Using cached LLVM download for ${LLVM}..."
  else
    wget --no-verbose $base_url/${LLVM}.tar.xz
    mkdir -p "${LLVM_DIRECTORY}"
    tar xf ${LLVM}.tar.xz -C "${LLVM_DIRECTORY}" --strip-components=1
  fi

  export LIBCLANG_PATH="${LLVM_DIRECTORY}/lib"
  export LLVM_CONFIG_PATH="${LLVM_DIRECTORY}/bin/llvm-config"
}

# Download and set up a sane LLVM version
set_llvm_env() {
  export LLVM_VERSION_TRIPLE=`llvm_version_triple ${LLVM_VERSION}`
  local base_url=`llvm_base_url ${LLVM_VERSION_TRIPLE}`

  if [ "$GITHUB_ACTIONS_OS" == "ubuntu-latest" ]; then
    llvm_download $base_url `llvm_linux_target_triple ${LLVM_VERSION_TRIPLE}`
    export LD_LIBRARY_PATH="${LLVM_DIRECTORY}/lib":${LD_LIBRARY_PATH:-}
  else
    llvm_download $base_url `llvm_macos_target_triple ${LLVM_VERSION_TRIPLE}`
    export DYLD_LIBRARY_PATH="${LLVM_DIRECTORY}/lib":${DYLD_LIBRARY_PATH:-}
  fi
}

# Need rustfmt to compare the test expectations.
set_rustfmt_env() {
  local toolchain="nightly-$(curl https://rust-lang.github.io/rustup-components-history/$(rustup target list --installed | tail -1)/rustfmt)"
  rustup update "$toolchain"
  rustup component add rustfmt --toolchain "$toolchain"
  export RUSTFMT="$(rustup which --toolchain "$toolchain" rustfmt)"
}

assert_no_diff() {
  git add -u
  git diff @
  git diff-index --quiet HEAD
}

set_llvm_env
set_rustfmt_env

get_cargo_args() {
  local args=""
  if [ ! -z "$RUST_TARGET" ]; then
    args+=" --target $RUST_TARGET"
  fi
  if [ "$BINDGEN_RELEASE_BUILD" == "1" ]; then
    args+=" --release"
  fi
  if [ "$BINDGEN_NO_DEFAULT_FEATURES" == "1" ]; then
    args+=" --no-default-features"
  fi
  local features=""
  if [ "$BINDGEN_FEATURE_RUNTIME" == "1"  ]; then
    features+="runtime"
  fi
  if [ "$BINDGEN_FEATURE_EXTRA_ASSERTS" == "1"  ]; then
    features+=" testing_only_extra_assertions"
  fi
  if [ "$BINDGEN_FEATURE_TESTING_ONLY_DOCS" == "1"  ]; then
    features+=" testing_only_docs"
  fi
  if [ ! -z "$features" ]; then
    args+=" --features $(echo $features | tr ' ' ',')"
  fi
  echo $args
}

if [ ! -z "$RUST_CROSS_COMPILER" ]; then
  export RUSTFLAGS="-C linker=${RUST_CROSS_COMPILER}-gcc"
fi

CARGO_ARGS=`get_cargo_args`

# Ensure we build without warnings
cargo rustc --lib $CARGO_ARGS -- -Dwarnings

if [ "$BINDGEN_MAIN_TESTS" == "1" ]; then
  # Run the tests
  cargo test $CARGO_ARGS
fi

assert_no_diff

# Run the integration tests
(cd bindgen-integration && cargo test $CARGO_ARGS)
