github.com/hairyhenderson/templater@v3.5.0+incompatible/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 }