github.com/expr-lang/expr@v1.16.9/internal/deref/deref.go (about)

     1  package deref
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  )
     7  
     8  func Deref(p any) any {
     9  	if p == nil {
    10  		return nil
    11  	}
    12  
    13  	v := reflect.ValueOf(p)
    14  
    15  	for v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface {
    16  		if v.IsNil() {
    17  			return nil
    18  		}
    19  		v = v.Elem()
    20  	}
    21  
    22  	if v.IsValid() {
    23  		return v.Interface()
    24  	}
    25  
    26  	panic(fmt.Sprintf("cannot dereference %v", p))
    27  }
    28  
    29  func Type(t reflect.Type) reflect.Type {
    30  	if t == nil {
    31  		return nil
    32  	}
    33  	for t.Kind() == reflect.Ptr {
    34  		t = t.Elem()
    35  	}
    36  	return t
    37  }
    38  
    39  func Value(v reflect.Value) reflect.Value {
    40  	for v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface {
    41  		if v.IsNil() {
    42  			return v
    43  		}
    44  		v = v.Elem()
    45  	}
    46  	return v
    47  }