1package version
2
3import (
4 "runtime/debug"
5 "strings"
6)
7
8// Default is the default version value used when none was found.
9const Default = "dev"
10
11// version holds the current version from the go.mod of downstream users or set by ldflag for wazero CLI.
12var version string
13
14// GetWazeroVersion returns the current version of wazero either in the go.mod or set by ldflag for wazero CLI.
15//
16// If this is not CLI, this assumes that downstream users of wazero imports wazero as "github.com/tetratelabs/wazero".
17// To be precise, the returned string matches the require statement there.
18// For example, if the go.mod has "require github.com/tetratelabs/wazero 0.1.2-12314124-abcd",
19// then this returns "0.1.2-12314124-abcd".
20//
21// Note: this is tested in ./testdata/main_test.go with a separate go.mod to pretend as the wazero user.
22func GetWazeroVersion() (ret string) {
23 if len(version) != 0 {
24 return version
25 }
26
27 info, ok := debug.ReadBuildInfo()
28 if ok {
29 for _, dep := range info.Deps {
30 // Note: here's the assumption that wazero is imported as github.com/tetratelabs/wazero.
31 if strings.Contains(dep.Path, "github.com/tetratelabs/wazero") {
32 ret = dep.Version
33 }
34 }
35
36 // In wazero CLI, wazero is a main module, so we have to get the version info from info.Main.
37 if versionMissing(ret) {
38 ret = info.Main.Version
39 }
40 }
41 if versionMissing(ret) {
42 return Default // don't return parens
43 }
44
45 // Cache for the subsequent calls.
46 version = ret
47 return ret
48}
49
50func versionMissing(ret string) bool {
51 return ret == "" || ret == "(devel)" // pkg.go defaults to (devel)
52}