Tao Wen 8 лет назад
Родитель
Сommit
baca358b53

+ 9 - 2
feature_any.go

@@ -9,6 +9,7 @@ import (
 type Any interface {
 	LastError() error
 	ValueType() ValueType
+	MustBeValid() Any
 	ToBool() bool
 	ToInt() int
 	ToInt32() int32
@@ -218,15 +219,21 @@ func locatePath(iter *Iterator, path []interface{}) Any {
 		switch pathKey := pathKeyObj.(type) {
 		case string:
 			valueBytes := locateObjectField(iter, pathKey)
+			if valueBytes == nil {
+				return newInvalidAny(path[i:])
+			}
 			iter.ResetBytes(valueBytes)
 		case int:
 			valueBytes := locateArrayElement(iter, pathKey)
+			if valueBytes == nil {
+				return newInvalidAny(path[i:])
+			}
 			iter.ResetBytes(valueBytes)
 		case int32:
 			if '*' == pathKey {
 				return iter.readAny().Get(path[i:]...)
 			} else {
-				return newInvalidAny(path)
+				return newInvalidAny(path[i:])
 			}
 		default:
 			return newInvalidAny(path[i:])
@@ -236,4 +243,4 @@ func locatePath(iter *Iterator, path []interface{}) Any {
 		return &invalidAny{baseAny{}, iter.Error}
 	}
 	return iter.readAny()
-}
+}

+ 8 - 0
feature_any_array.go

@@ -16,6 +16,10 @@ func (any *arrayLazyAny) ValueType() ValueType {
 	return Array
 }
 
+func (any *arrayLazyAny) MustBeValid() Any {
+	return any
+}
+
 func (any *arrayLazyAny) LastError() error {
 	return any.err
 }
@@ -182,6 +186,10 @@ func (any *arrayAny) ValueType() ValueType {
 	return Array
 }
 
+func (any *arrayAny) MustBeValid() Any {
+	return any
+}
+
 func (any *arrayAny) LastError() error {
 	return nil
 }

+ 8 - 0
feature_any_bool.go

@@ -64,6 +64,10 @@ func (any *trueAny) ValueType() ValueType {
 	return Bool
 }
 
+func (any *trueAny) MustBeValid() Any {
+	return any
+}
+
 type falseAny struct {
 	baseAny
 }
@@ -127,3 +131,7 @@ func (any *falseAny) GetInterface() interface{} {
 func (any *falseAny) ValueType() ValueType {
 	return Bool
 }
+
+func (any *falseAny) MustBeValid() Any {
+	return any
+}

+ 4 - 0
feature_any_float.go

@@ -18,6 +18,10 @@ func (any *floatAny) ValueType() ValueType {
 	return Number
 }
 
+func (any *floatAny) MustBeValid() Any {
+	return any
+}
+
 func (any *floatAny) LastError() error {
 	return nil
 }

+ 4 - 0
feature_any_int32.go

@@ -17,6 +17,10 @@ func (any *int32Any) ValueType() ValueType {
 	return Number
 }
 
+func (any *int32Any) MustBeValid() Any {
+	return any
+}
+
 func (any *int32Any) ToBool() bool {
 	return any.val != 0
 }

+ 4 - 0
feature_any_int64.go

@@ -17,6 +17,10 @@ func (any *int64Any) ValueType() ValueType {
 	return Number
 }
 
+func (any *int64Any) MustBeValid() Any {
+	return any
+}
+
 func (any *int64Any) ToBool() bool {
 	return any.val != 0
 }

+ 5 - 0
feature_any_invalid.go

@@ -19,6 +19,11 @@ func (any *invalidAny) ValueType() ValueType {
 	return Invalid
 }
 
+func (any *invalidAny) MustBeValid() Any {
+	panic(any.err)
+	return any
+}
+
 func (any *invalidAny) ToBool() bool {
 	return false
 }

+ 4 - 0
feature_any_nil.go

@@ -12,6 +12,10 @@ func (any *nilAny) ValueType() ValueType {
 	return Nil
 }
 
+func (any *nilAny) MustBeValid() Any {
+	return any
+}
+
 func (any *nilAny) ToBool() bool {
 	return false
 }

+ 4 - 0
feature_any_number.go

@@ -15,6 +15,10 @@ func (any *numberLazyAny) ValueType() ValueType {
 	return Number
 }
 
+func (any *numberLazyAny) MustBeValid() Any {
+	return any
+}
+
 func (any *numberLazyAny) LastError() error {
 	return any.err
 }

+ 12 - 0
feature_any_object.go

@@ -16,6 +16,10 @@ func (any *objectLazyAny) ValueType() ValueType {
 	return Object
 }
 
+func (any *objectLazyAny) MustBeValid() Any {
+	return any
+}
+
 func (any *objectLazyAny) LastError() error {
 	return any.err
 }
@@ -195,6 +199,10 @@ func (any *objectAny) ValueType() ValueType {
 	return Object
 }
 
+func (any *objectAny) MustBeValid() Any {
+	return any
+}
+
 func (any *objectAny) Parse() *Iterator {
 	return nil
 }
@@ -346,6 +354,10 @@ func (any *mapAny) ValueType() ValueType {
 	return Object
 }
 
+func (any *mapAny) MustBeValid() Any {
+	return any
+}
+
 func (any *mapAny) Parse() *Iterator {
 	return nil
 }

+ 4 - 0
feature_any_string.go

@@ -25,6 +25,10 @@ func (any *stringAny) ValueType() ValueType {
 	return String
 }
 
+func (any *stringAny) MustBeValid() Any {
+	return any
+}
+
 func (any *stringAny) LastError() error {
 	return nil
 }

+ 4 - 0
feature_any_uint32.go

@@ -17,6 +17,10 @@ func (any *uint32Any) ValueType() ValueType {
 	return Number
 }
 
+func (any *uint32Any) MustBeValid() Any {
+	return any
+}
+
 func (any *uint32Any) ToBool() bool {
 	return any.val != 0
 }

+ 4 - 0
feature_any_uint64.go

@@ -17,6 +17,10 @@ func (any *uint64Any) ValueType() ValueType {
 	return Number
 }
 
+func (any *uint64Any) MustBeValid() Any {
+	return any
+}
+
 func (any *uint64Any) ToBool() bool {
 	return any.val != 0
 }