#!/usr/bin/env bash
set -eo pipefail

echo "---> Rust Buildpack"

# 1. GET ARGS
layers_dir=$1
plan_path=$3

# shellcheck source=/dev/null
. generate-project.sh "${layers_dir}"

# 2. Install build deps
# shellcheck source=/dev/null
. generate-layers.sh "${layers_dir}"
generate_deps_layer build-deps
generate_deps_layer run-deps

# 3. install rust
generate_stack_layer rust "${plan_path}" false

# shellcheck source=/dev/null
. init-stack

echo "-----> Building application using Cargo"
if [ -s .cargo/config ]; then
  cp -f .cargo/config /opt/drycc/rust/config
fi

# cargo layer
cargo_layer_dir="${layers_dir}/cargo"
mkdir -p "${cargo_layer_dir}"
echo "---> Generating cargo layers"
cat >"${cargo_layer_dir}.toml" <<EOL
[types]
cache = true
build = true
launch = false
EOL

# target layer
target_layer_dir="${layers_dir}"/target
mkdir -p "${target_layer_dir}"/{profile.d,release}

echo "---> Building target with cargo"
cp -rf "$(pwd)" /tmp/source \
  && cd /tmp/source \
  && export CARGO_HOME="${cargo_layer_dir}" \
  && export CARGO_TARGET_DIR=/tmp/source/target \
  && cargo build --release \
  && find "${CARGO_TARGET_DIR}"/release -maxdepth 1 -type f -executable -exec cp -a -t "${target_layer_dir}"/release {} \; \
  && cd -

cat >"${target_layer_dir}.toml" <<EOL
[types]
cache = false
build = true
launch = true
EOL
cat >"${target_layer_dir}/profile.d/copy_target.sh" <<EOL
# only execute at runtime
if [ -z "\$INIT_STACK" ]; then
  rm -rf $(pwd)/target
  cp -rf ${target_layer_dir} $(pwd)
fi
EOL

generate-launch.sh "${layers_dir}"
