77 lines
1.9 KiB
Go
77 lines
1.9 KiB
Go
package reporttemplate
|
|
|
|
import (
|
|
"reflect"
|
|
"strings"
|
|
"text/template"
|
|
)
|
|
|
|
func templateFuncs() template.FuncMap {
|
|
return template.FuncMap{
|
|
"hasRelevantAlerts": hasRelevantAlerts,
|
|
"hasEnhancedOrHigherSPCRisk": hasEnhancedOrHigherSPCRisk,
|
|
"isEnhancedOrHigherSPCRisk": isEnhancedOrHigherSPCRisk,
|
|
}
|
|
}
|
|
|
|
func hasRelevantAlerts(alertDigest any) bool {
|
|
value := dereferenceValue(reflect.ValueOf(alertDigest))
|
|
if !value.IsValid() || value.Kind() != reflect.Struct {
|
|
return false
|
|
}
|
|
relevant := value.FieldByName("Relevant")
|
|
return relevant.IsValid() && relevant.Kind() == reflect.Slice && relevant.Len() > 0
|
|
}
|
|
|
|
func hasEnhancedOrHigherSPCRisk(outlooks any) bool {
|
|
value := dereferenceValue(reflect.ValueOf(outlooks))
|
|
if !value.IsValid() || value.Kind() != reflect.Struct {
|
|
return false
|
|
}
|
|
riskDigest := value.FieldByName("RiskDigest")
|
|
if !riskDigest.IsValid() || riskDigest.Kind() != reflect.Slice {
|
|
return false
|
|
}
|
|
for i := 0; i < riskDigest.Len(); i++ {
|
|
if isEnhancedOrHigherSPCRisk(riskDigest.Index(i).Interface()) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func isEnhancedOrHigherSPCRisk(risk any) bool {
|
|
value := dereferenceValue(reflect.ValueOf(risk))
|
|
if !value.IsValid() || value.Kind() != reflect.Struct {
|
|
return false
|
|
}
|
|
label := stringField(value, "LabelText")
|
|
if label == "" {
|
|
label = stringField(value, "RiskLabel")
|
|
}
|
|
switch strings.ToLower(strings.TrimSpace(label)) {
|
|
case "enhanced risk", "moderate risk", "high risk":
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
func dereferenceValue(value reflect.Value) reflect.Value {
|
|
for value.IsValid() && (value.Kind() == reflect.Interface || value.Kind() == reflect.Pointer) {
|
|
if value.IsNil() {
|
|
return reflect.Value{}
|
|
}
|
|
value = value.Elem()
|
|
}
|
|
return value
|
|
}
|
|
|
|
func stringField(value reflect.Value, name string) string {
|
|
field := value.FieldByName(name)
|
|
if !field.IsValid() || field.Kind() != reflect.String {
|
|
return ""
|
|
}
|
|
return field.String()
|
|
}
|