@@ -4,12 +4,12 @@ import (
44 "fmt"
55 "github.com/mohae/utilitybelt/deepcopy"
66 //"golang.org/x/tools/go/types"
7+ "errors"
78 "go/token"
89 "go/types"
910 "reflect"
1011 "strconv"
1112 "strings"
12- "errors"
1313)
1414
1515var ErrGetFromNullObj = errors .New ("get attribute from null object" )
@@ -283,6 +283,16 @@ func get_key(obj interface{}, key string) (interface{}, error) {
283283 }
284284 switch reflect .TypeOf (obj ).Kind () {
285285 case reflect .Map :
286+ // if obj came from stdlib json, its highly likely to be a map[string]interface{}
287+ // in which case we can save having to iterate the map keys to work out if the
288+ // key exists
289+ if jsonMap , ok := obj .(map [string ]interface {}); ok {
290+ val , exists := jsonMap [key ]
291+ if ! exists {
292+ return nil , fmt .Errorf ("key error: %s not found in object" , key )
293+ }
294+ return val , nil
295+ }
286296 for _ , kv := range reflect .ValueOf (obj ).MapKeys () {
287297 //fmt.Println(kv.String())
288298 if kv .String () == key {
@@ -417,9 +427,12 @@ func parse_filter(filter string) (lp string, op string, rp string, err error) {
417427 str_embrace = true
418428 } else {
419429 switch stage {
420- case 0 : lp = tmp
421- case 1 : op = tmp
422- case 2 : rp = tmp
430+ case 0 :
431+ lp = tmp
432+ case 1 :
433+ op = tmp
434+ case 2 :
435+ rp = tmp
423436 }
424437 tmp = ""
425438 }
@@ -429,9 +442,12 @@ func parse_filter(filter string) (lp string, op string, rp string, err error) {
429442 continue
430443 }
431444 switch stage {
432- case 0 : lp = tmp
433- case 1 : op = tmp
434- case 2 : rp = tmp
445+ case 0 :
446+ lp = tmp
447+ case 1 :
448+ op = tmp
449+ case 2 :
450+ rp = tmp
435451 }
436452 tmp = ""
437453
@@ -448,8 +464,10 @@ func parse_filter(filter string) (lp string, op string, rp string, err error) {
448464 case 0 :
449465 lp = tmp
450466 op = "exists"
451- case 1 : op = tmp
452- case 2 : rp = tmp
467+ case 1 :
468+ op = tmp
469+ case 2 :
470+ rp = tmp
453471 }
454472 tmp = ""
455473 }
@@ -528,11 +546,11 @@ func eval_filter(obj, root interface{}, lp, op, rp string) (res bool, err error)
528546
529547func isNumber (o interface {}) bool {
530548 switch v := o .(type ) {
531- case int ,int8 ,int16 ,int32 ,int64 :
549+ case int , int8 , int16 , int32 , int64 :
532550 return true
533- case uint ,uint8 ,uint16 ,uint32 ,uint64 :
551+ case uint , uint8 , uint16 , uint32 , uint64 :
534552 return true
535- case float32 ,float64 :
553+ case float32 , float64 :
536554 return true
537555 case string :
538556 _ , err := strconv .ParseFloat (v , 64 )
0 commit comments