Update the Alert Digest partial template to be more concise
This commit is contained in:
76
internal/reporttemplate/template_funcs.go
Normal file
76
internal/reporttemplate/template_funcs.go
Normal file
@@ -0,0 +1,76 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user