func()

in pkg/log/structure/merger/merged.go [77:133]


func (d *StrategicMergedStructureData) Keys() ([]string, error) {
	prevKeys, err := d.prev.Keys()
	if err != nil {
		return nil, err
	}
	patchKeys, err := d.patch.Keys()
	if err != nil {
		return nil, err
	}
	ty, err := d.Type()
	if err != nil {
		return nil, err
	}
	patchAttr, err := d.readScalarAsString(d.patch, "$patch")
	if patchAttr == "delete" {
		return []string{""}, nil
	}

	switch ty {
	case structuredata.StructuredTypeMap:
		keydiff := NewKeyDiff(prevKeys, patchKeys)
		strategicPatchKeys := splitPatchKeysByFieldsOrMergeAttributes(keydiff.OnlyInPatch)
		if err == nil {
			if patchAttr == "replace" {
				return append(keydiff.Both, strategicPatchKeys.FieldKeys...), nil
			}
		}
		result := []string{}
		result = append(result, prevKeys...)
		result = append(result, strategicPatchKeys.FieldKeys...)
		retainKeysAttr, err := d.readStringArray(d.patch, "$retainKeys")
		if err == nil {
			retainKeysInMap := map[string]struct{}{}
			for _, key := range retainKeysAttr {
				retainKeysInMap[key] = struct{}{}
			}
			retainResult := []string{}
			for _, key := range result {
				if _, in := retainKeysInMap[key]; in {
					retainResult = append(retainResult, key)
				}
			}
			return retainResult, nil
		}
		return result, nil
	case structuredata.StructuredTypeArray:
		if d.arrayMergeResultSourceCache == nil {
			err := d.buildArrayMergeResultSourceCache()
			if err != nil {
				return nil, err
			}
		}
		return stringSequence(len(d.arrayMergeResultSourceCache.References)), nil
	default:
		return []string{""}, nil
	}
}