package anchor import ( "path" "strings" ) // GetAnchorsResourcesFromMap returns maps of anchors and resources func GetAnchorsResourcesFromMap(patternMap map[string]interface{}) (map[string]interface{}, map[string]interface{}) { anchors := map[string]interface{}{} resources := map[string]interface{}{} for key, value := range patternMap { if a := Parse(key); IsCondition(a) || IsExistence(a) || IsEquality(a) || IsNegation(a) { anchors[key] = value } else { resources[key] = value } } return anchors, resources } // RemoveAnchorsFromPath removes all anchor from path string func RemoveAnchorsFromPath(str string) string { parts := strings.Split(str, "/") if parts[0] == "" { parts = parts[1:] } for i, part := range parts { if a := Parse(part); a != nil { parts[i] = a.Key() } else { parts[i] = part } } newPath := path.Join(parts...) if path.IsAbs(str) { newPath = "/" + newPath } return newPath } // resourceHasValueForKey checks if a resource has value for a given key func resourceHasValueForKey(resource interface{}, key string) bool { switch typed := resource.(type) { case map[string]interface{}: if _, ok := typed[key]; ok { return true } return false case []interface{}: for _, value := range typed { if resourceHasValueForKey(value, key) { return true } } return false default: return false } }