#!/usr/bin/env bash

# Top-level 'universal' shell library for hscloud. All sh_binary targets should
# depend on this and import it as follows:
#
#  #!/usr/bin/env bash
#  source tools/hscloud/lib.sh || exit 1
#
# And by specifying deps = [ "//tools/hscloud:shell" ] in sh_binary.

set -e -u -o pipefail

function hscloud::_prepare_runfiles() {
    if [[ $(type -t rlocation) == function ]]; then
        return
    fi
    # --- begin runfiles.bash initialization v2 ---
    # Mostly copy-pasted from the Bazel Bash runfiles library v2.
    local f=bazel_tools/tools/bash/runfiles/runfiles.bash
    source "${RUNFILES_DIR:-/dev/null}/$f" 2>/dev/null || \
      source "$(grep -sm1 "^$f " "${RUNFILES_MANIFEST_FILE:-/dev/null}" | cut -f2- -d' ')" 2>/dev/null || \
      source "$0.runfiles/$f" 2>/dev/null || \
      source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
      source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
      { echo>&2 "ERROR: cannot find $f - are you in a valid checkout and running the script via bazel?"; exit 1; }
    # --- end runfiles.bash initialization v2 ---
}

# Return an absolute path to a built //tools/hscloud binary, ready to run.
#
# This will fail if we're not in a hscloud checkout.
function hscloud::tool_location() {
    rloc="$(hscloud::rlocation "hscloud/tools/hscloud/hscloud_/hscloud")"
    if [ -z "$rloc" ]; then
        echo "Could not find location of hscloud - are you in a valid checkout and running the script via bazel?" >&2
        exit 1
    fi
    echo "$rloc"
}

# Return an absolute path to the hscloud checkout.
function hscloud::workspace_location() {
    $(hscloud::tool_location) workspace
}

# Return an absolute path to a runfile, eg. a data dependency in sh_binary.
function hscloud::rlocation() {
    hscloud::_prepare_runfiles
    echo "$(rlocation "$1")"
}

# Return an absolute path to a runfile, eg. a data dependency in sh_binary.
#
# This will fail if the runfile is not found.
function hscloud::must_rlocation() {
    rloc="$(hscloud::rlocation $1)"
    if [ -z "$rloc" ]; then
        echo "Could not find runfile $1" >&2
        if [ ! -z "${RUNFILES_MANIFEST_FILE:-}" ]; then
            echo "Manifest file: $RUNFILES_MANIFEST_FILE" >&2
        fi
        exit 1
    fi
    echo "$rloc"
}
