summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/mattermost/logr/v2/pkg.go
blob: 873b2e953eb392958db584d286072bd7cccb0e7d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package logr

import (
	"runtime"
	"strings"
	"sync"
)

const (
	maximumStackDepth int = 30
)

var (
	logrPkg     string
	pkgCalcOnce sync.Once
)

// GetPackageName returns the root package name of Logr.
func GetLogrPackageName() string {
	pkgCalcOnce.Do(func() {
		logrPkg = GetPackageName("GetLogrPackageName")
	})
	return logrPkg
}

// GetPackageName returns the package name of the caller.
// `callingFuncName` should be the name of the calling function and
// should be unique enough not to collide with any runtime methods.
func GetPackageName(callingFuncName string) string {
	var pkgName string

	pcs := make([]uintptr, maximumStackDepth)
	_ = runtime.Callers(0, pcs)

	for _, pc := range pcs {
		funcName := runtime.FuncForPC(pc).Name()
		if strings.Contains(funcName, callingFuncName) {
			pkgName = ResolvePackageName(funcName)
			break
		}
	}
	return pkgName
}

// ResolvePackageName reduces a fully qualified function name to the package name
func ResolvePackageName(f string) string {
	for {
		lastPeriod := strings.LastIndex(f, ".")
		lastSlash := strings.LastIndex(f, "/")
		if lastPeriod > lastSlash {
			f = f[:lastPeriod]
		} else {
			break
		}
	}
	return f
}