package briefing import ( "gitea.maximumdirect.net/eric/weatherreporter/internal/facts" "gitea.maximumdirect.net/eric/weatherreporter/internal/forecast" "gitea.maximumdirect.net/eric/weatherreporter/internal/module" "gitea.maximumdirect.net/eric/weatherreporter/internal/weatherdata" ) type AlertDigestModule struct { Checked bool `json:"checked"` ActiveCount int `json:"active_count"` RelevantCount int `json:"relevant_count"` Missing bool `json:"missing,omitempty"` Relevant []AlertSummary `json:"relevant,omitempty"` } type AlertSummary struct { Event string `json:"event,omitempty"` Headline string `json:"headline,omitempty"` Severity string `json:"severity,omitempty"` PeriodBegins string `json:"period_begins,omitempty"` PeriodEnds string `json:"period_ends,omitempty"` Instruction string `json:"instruction,omitempty"` Description string `json:"description,omitempty"` } func buildAlertDigestModule(ctx ModuleContext, _ any) (*module.Output, error) { value := alertDigest(ctx.Collected, ctx.Derived.AlertOverlaps, ctx.Timezone) if value == nil { value = &AlertDigestModule{} } return &module.Output{ID: module.AlertDigest, StanzaName: "alert_digest", Value: *value}, nil } func alertDigest(collected facts.CollectedFacts, overlaps []forecast.AlertOverlap, timezone string) *AlertDigestModule { missing := sourceMissing(collected.SourceProvenance, "alerts") if collected.Alerts == nil && !missing { return nil } value := &AlertDigestModule{Missing: missing} if collected.Alerts != nil { value.Checked = true value.ActiveCount = len(collected.Alerts.Alerts) } value.RelevantCount = len(overlaps) for _, overlap := range overlaps { value.Relevant = append(value.Relevant, AlertSummary{ Event: overlap.Event, Headline: overlap.Headline, Severity: overlap.Severity, PeriodBegins: friendlyMonthDayTimeLabel(overlap.Period.Start, timezone), PeriodEnds: friendlyMonthDayTimeLabel(overlap.Period.End, timezone), Instruction: overlap.Instruction, Description: overlap.Description, }) } return value } func sourceMissing(sources []weatherdata.Source, name string) bool { for _, source := range sources { if source.Name == name && source.Missing { return true } } return false }