github.com/wfusion/gofusion@v1.1.14/common/utils/context.go (about)

     1  package utils
     2  
     3  import (
     4  	"context"
     5  	"reflect"
     6  )
     7  
     8  // GetCtxAny with a default value
     9  func GetCtxAny[T any](ctx context.Context, key string, args ...T) (val T) {
    10  	if v := ctx.Value(key); v != nil {
    11  		return v.(T)
    12  	}
    13  	if len(args) == 0 {
    14  		return
    15  	}
    16  	return args[0]
    17  }
    18  
    19  // SetCtxAny with any value
    20  func SetCtxAny[T any](ctx context.Context, key string, val T) context.Context {
    21  	return context.WithValue(ctx, key, val)
    22  }
    23  
    24  // TravelCtx context parent traversal
    25  func TravelCtx(child context.Context, fn func(ctx context.Context) bool) {
    26  	v := reflect.ValueOf(child)
    27  	for p := v; p.IsValid() && p.CanInterface(); p = p.FieldByName("Context") {
    28  		parent, ok := p.Interface().(context.Context)
    29  		if !ok || parent == nil || fn(parent) {
    30  			break
    31  		}
    32  		if p = reflect.Indirect(p); p.Kind() != reflect.Struct {
    33  			break
    34  		}
    35  	}
    36  }