forked from lug/matterbridge
		
	
		
			
				
	
	
		
			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
 | |
| }
 | 
