func flattenRule()

in cvefeed/stats.go [122:149]


func flattenRule(node *schema.NVDCVEFeedJSON10DefNode, operators *stack) string {
	cpePart := ""
	operators.push(node.Operator)
	switch {
	case len(node.Children) > 0:
		outputs := []string{}
		for _, c := range node.Children {
			outputs = append(outputs, flattenRule(c, operators))
		}
		operator, _ := operators.pop()
		return fmt.Sprintf("(%s)", strings.Join(outputs, fmt.Sprintf(" %s ", operator)))
	case len(node.CPEMatch) > 0:
		for _, cpeMatch := range node.CPEMatch {
			cpeItems := strings.Split(cpeMatch.Cpe23Uri, ":")
			if len(cpeItems) > 2 {
				part := cpeItems[2]
				if _, ok := cpeParts[part]; ok && !strings.Contains(cpePart, part) {
					cpePart += part
				}
			}
		}
		operator, _ := operators.pop()
		if len(cpePart) > 1 {
			return fmt.Sprintf("(%s)", strings.Join(strings.Split(cpePart, ""), fmt.Sprintf(" %s ", operator)))
		}
	}
	return cpePart
}