github.com/MontFerret/ferret@v0.18.0/pkg/stdlib/objects/keep_keys.go (about) 1 package objects 2 3 import ( 4 "context" 5 6 "github.com/MontFerret/ferret/pkg/runtime/core" 7 "github.com/MontFerret/ferret/pkg/runtime/values" 8 "github.com/MontFerret/ferret/pkg/runtime/values/types" 9 ) 10 11 // KEEP_KEYS returns a new object with only given keys. 12 // @param {Object} obj - Source object. 13 // @param {String, repeated} keys - Keys that need to be kept. 14 // @return {Object} - New Object with only given keys. 15 func KeepKeys(_ context.Context, args ...core.Value) (core.Value, error) { 16 err := core.ValidateArgs(args, 2, core.MaxArgs) 17 18 if err != nil { 19 return values.None, err 20 } 21 22 err = core.ValidateType(args[0], types.Object) 23 24 if err != nil { 25 return values.None, err 26 } 27 28 keys := values.NewArrayWith(args[1:]...) 29 30 if len(args) == 2 && args[1].Type().Equals(types.Array) { 31 keys = args[1].(*values.Array) 32 } 33 34 err = validateArrayOf(types.String, keys) 35 36 if err != nil { 37 return values.None, err 38 } 39 40 obj := args[0].(*values.Object) 41 resultObj := values.NewObject() 42 43 var key values.String 44 var val core.Value 45 var exists values.Boolean 46 47 keys.ForEach(func(keyVal core.Value, idx int) bool { 48 key = keyVal.(values.String) 49 50 if val, exists = obj.Get(key); exists { 51 cloneable, ok := val.(core.Cloneable) 52 53 if ok { 54 val = cloneable.Clone() 55 } 56 57 resultObj.Set(key, val) 58 } 59 60 return true 61 }) 62 63 return resultObj, nil 64 }