Files
weatherreporter/internal/reporttemplate/template_funcs.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()
}