mirror of
https://github.com/42wim/matterbridge
synced 2024-11-17 03:26:07 +00:00
58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
|
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
|
||
|
}
|