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  }