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() }