// gotoolchain provides information about the Go toolchain used on the host by
// rules_go.
package gotoolchain

import (
	"fmt"
	"os"
	"strings"

	"github.com/bazelbuild/rules_go/go/tools/bazel"
)

func mustRunfile(s string) string {
    // When running as a tool (in a genrule, or a test, etc.), bazel.Runfile
    // does not work. However, ${0}.runfiles/$runfile should be present. If so,
    // return early and return that. Otherwise, carry on with bazel.Runfile.
    //
    // TODO(q3k): dig deeper into this and unify with //metropolis/cli/pkg/datafile.

    // Ignore the error, worst case we get an empty string that will make a
    // garbage path that won't point to a file.
    ex, _ := os.Executable()
    rf := ex + ".runfiles"
    if _, err := os.Stat(rf); err == nil {
        parts := strings.Split(s, "/")
        parts[0] = rf
        rf = strings.Join(parts, "/")
        if _, err := os.Stat(rf); err == nil {
            return rf
        }
    }

	res, err := bazel.Runfile(s)
	if err != nil {
		panic(fmt.Sprintf("runfile %q not found: %v", s, err))
	}
	return res
}

var (
	// Go is a path to the `go` executable.
	Go = mustRunfile(`GOTOOL`)
	// Root is the GOROOT path.
	Root = mustRunfile(`GOROOT`)
)
