Validate precipitation probabilities and ice wording

This commit is contained in:
2026-08-13 00:48:40 +00:00
parent 8e49ba88c7
commit 730929e2ed
10 changed files with 142 additions and 1 deletions

View File

@@ -192,6 +192,9 @@ func BuildDailySummary(bundle *weatherdata.Bundle, date time.Time, location *tim
if bundle.Hourly == nil || len(bundle.Hourly.Periods) == 0 {
return nil, fmt.Errorf("hourly forecast data is required")
}
if err := ValidatePrecipitationProbabilities(bundle.Hourly.Periods); err != nil {
return nil, err
}
day := timeutil.CivilDay(date, location)
windows, err := ResolveDayparts(date, location, dayparts)
if err != nil {
@@ -247,6 +250,15 @@ func SelectDiscussion(bundle *weatherdata.Bundle) *weatherdata.Discussion {
return bundle.Discussion
}
func ValidatePrecipitationProbabilities(periods []weatherdata.ForecastPeriod) error {
for i, period := range periods {
if !period.HasValidPrecipitationProbability() {
return fmt.Errorf("hourly forecast period %d has an invalid precipitation probability", i+1)
}
}
return nil
}
func SummarizeDaypart(name string, period timeutil.Period, periods []weatherdata.ForecastPeriod) DaypartSummary {
summary := DaypartSummary{
Name: name,
@@ -357,12 +369,24 @@ func indicatorsForText(text string) Indicators {
lower := strings.ToLower(text)
return Indicators{
Snow: strings.Contains(lower, "snow"),
Ice: strings.Contains(lower, "ice") || strings.Contains(lower, "freezing") || strings.Contains(lower, "sleet"),
Ice: mentionsIce(lower),
Fog: strings.Contains(lower, "fog"),
Wind: strings.Contains(lower, "wind") || strings.Contains(lower, "gust"),
}
}
func mentionsIce(text string) bool {
for _, token := range strings.FieldsFunc(text, func(r rune) bool {
return !('a' <= r && r <= 'z')
}) {
switch token {
case "ice", "icy", "freezing", "sleet":
return true
}
}
return false
}
func mentionsThunder(text string) bool {
return strings.Contains(strings.ToLower(text), "thunder")
}