mirror of
https://github.com/MontFerret/ferret.git
synced 2025-11-06 08:39:09 +02:00
Next (#214)
* Renamed DOCUMENT to PAGE * Added PageLoadParams * Added PageLoadParams * Renamed LoadPageParams -> PageLoadParams * Added support for context.Done() (#201) * Bug/#189 operators precedence (#202) * Fixed math operators precedence * Fixed logical operators precedence * Fixed array operator * Added support for parentheses to enforce a different operator evaluation order * Feature/#200 drivers (#209) * Added new interfaces * Renamed dynamic to cdp driver * Renamed drivers * Added ELEMENT_EXISTS function (#210) * Renamed back PAGE to DOCUMENT (#211) * Added Getter and Setter interfaces
This commit is contained in:
@@ -19,7 +19,7 @@ func GetIn(from core.Value, byPath []core.Value) (core.Value, error) {
|
||||
var result = from
|
||||
var err error
|
||||
|
||||
for _, segment := range byPath {
|
||||
for i, segment := range byPath {
|
||||
if result == None || result == nil {
|
||||
break
|
||||
}
|
||||
@@ -92,6 +92,12 @@ func GetIn(from core.Value, byPath []core.Value) (core.Value, error) {
|
||||
}
|
||||
|
||||
default:
|
||||
getter, ok := result.(core.Getter)
|
||||
|
||||
if ok {
|
||||
return getter.GetIn(byPath[i:])
|
||||
}
|
||||
|
||||
return None, core.TypeError(
|
||||
from.Type(),
|
||||
core.ArrayType,
|
||||
@@ -144,11 +150,19 @@ func SetIn(to core.Value, byPath []core.Value, value core.Value) error {
|
||||
if isTarget == false {
|
||||
current = parent.Get(segment.(Int))
|
||||
} else {
|
||||
parent.Set(segment.(Int), value)
|
||||
if err := parent.Set(segment.(Int), value); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
break
|
||||
default:
|
||||
setter, ok := parent.(core.Setter)
|
||||
|
||||
if ok {
|
||||
return setter.SetIn(byPath[idx:0], value)
|
||||
}
|
||||
|
||||
// redefine parent
|
||||
isArray := segmentType == core.IntType
|
||||
|
||||
@@ -169,12 +183,16 @@ func SetIn(to core.Value, byPath []core.Value, value core.Value) error {
|
||||
parent = arr
|
||||
|
||||
if isTarget {
|
||||
arr.Set(segment.(Int), value)
|
||||
if err := arr.Set(segment.(Int), value); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// set new parent
|
||||
SetIn(to, byPath[0:idx-1], parent)
|
||||
if err := SetIn(to, byPath[0:idx-1], parent); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if isTarget == false {
|
||||
current = None
|
||||
|
||||
Reference in New Issue
Block a user