function matchesRule()

in modules/entities/group_manager.js [120:204]


        function matchesRule(rule) {
            if (rule.any) {
                return rule.any.some(matchesRule);
            } else if (rule.all) {
                return rule.all.every(matchesRule);
            } else if (rule.none) {
                return !rule.none.some(matchesRule);
            } else if (rule.notAll) {
                return !rule.notAll.every(matchesRule);
            }

            if (rule.geometry) {
                if (Array.isArray(rule.geometry)) {
                    if (rule.geometry.indexOf(geometry) === -1) return false;
                } else {
                    if (rule.geometry !== geometry) return false;
                }
            }
            var ruleKey;
            if (rule.allTags) {
                for (ruleKey in rule.allTags) {
                    if (!matchesTagComponent(ruleKey, rule.allTags)) return false;
                }
            }
            if (rule.anyTags) {
                var didMatch = false;
                for (ruleKey in rule.anyTags) {
                    if (matchesTagComponent(ruleKey, rule.anyTags)) {
                        didMatch = true;
                        break;
                    }
                }
                if (!didMatch) return false;
            }
            if (rule.notAnyTags) {
                for (ruleKey in rule.notAnyTags) {
                    if (matchesTagComponent(ruleKey, rule.notAnyTags)) return false;
                }
            }

            if (rule.allowOtherTags === false) {
                var ruleTags = ruleTagsFor(rule);
                for (var key in tags) {
                    if (!ruleTags[key]) return false;
                    if (typeof ruleTags[key] === 'object') {
                        if (!ruleTags[key][tags[key]]) return false;
                    }
                }
            }

            var otherGroupID, matchesOther;

            if (rule.allGroups) {
                for (otherGroupID in rule.allGroups) {
                    // avoid simple infinte recursion
                    if (otherGroupID === group.id) continue;
                    // skip erroneous group IDs
                    if (!allGroups[otherGroupID]) continue;

                    matchesOther = allGroups[otherGroupID].matchesTags(tags, geometry);
                    if ((rule.allGroups[otherGroupID] && !matchesOther) ||
                        (!rule.allGroups[otherGroupID] && matchesOther)) return false;
                }
            }

            if (rule.anyGroups) {
                var didMatchGroup = false;
                for (otherGroupID in rule.anyGroups) {
                    // avoid simple infinte recursion
                    if (otherGroupID === group.id) continue;
                    // skip erroneous group IDs
                    if (!allGroups[otherGroupID]) continue;

                    matchesOther = allGroups[otherGroupID].matchesTags(tags, geometry);
                    if ((rule.anyGroups[otherGroupID] && matchesOther) ||
                        (!rule.anyGroups[otherGroupID] && !matchesOther)) {
                        didMatchGroup = true;
                        break;
                    }
                }
                if (!didMatchGroup) return false;
            }

            return true;
        }