github.com/hairyhenderson/gomplate/v3@v3.11.7/coll/jsonpath.go (about)

     1  package coll
     2  
     3  import (
     4  	"reflect"
     5  
     6  	"github.com/pkg/errors"
     7  	"k8s.io/client-go/util/jsonpath"
     8  )
     9  
    10  // JSONPath -
    11  func JSONPath(p string, in interface{}) (interface{}, error) {
    12  	jp, err := parsePath(p)
    13  	if err != nil {
    14  		return nil, errors.Wrapf(err, "couldn't parse JSONPath %s", p)
    15  	}
    16  	results, err := jp.FindResults(in)
    17  	if err != nil {
    18  		return nil, errors.Wrap(err, "executing JSONPath failed")
    19  	}
    20  
    21  	var out interface{}
    22  	if len(results) == 1 && len(results[0]) == 1 {
    23  		v := results[0][0]
    24  		out, err = extractResult(v)
    25  		if err != nil {
    26  			return nil, err
    27  		}
    28  	} else {
    29  		a := []interface{}{}
    30  		for _, r := range results {
    31  			for _, v := range r {
    32  				o, err := extractResult(v)
    33  				if err != nil {
    34  					return nil, err
    35  				}
    36  				if o != nil {
    37  					a = append(a, o)
    38  				}
    39  			}
    40  		}
    41  		out = a
    42  	}
    43  
    44  	return out, nil
    45  }
    46  
    47  func parsePath(p string) (*jsonpath.JSONPath, error) {
    48  	jp := jsonpath.New("<jsonpath>")
    49  	err := jp.Parse("{" + p + "}")
    50  	if err != nil {
    51  		return nil, err
    52  	}
    53  	jp.AllowMissingKeys(false)
    54  	return jp, nil
    55  }
    56  
    57  func extractResult(v reflect.Value) (interface{}, error) {
    58  	if v.CanInterface() {
    59  		return v.Interface(), nil
    60  	}
    61  
    62  	return nil, errors.Errorf("JSONPath couldn't access field")
    63  }