// FILE: ./internal/normalizers/nws/metar.go package nws import ( "encoding/json" "strings" ) // metarPhenomenon is a typed view of NWS presentWeather objects. type metarPhenomenon struct { Intensity *string `json:"intensity"` // "light", "heavy", or null Modifier *string `json:"modifier"` // "freezing", "showers", etc., or null Weather string `json:"weather"` // e.g. "rain", "snow", "fog_mist", ... RawString string `json:"rawString"` InVicinity *bool `json:"inVicinity"` } func decodeMetarPhenomena(raw []map[string]any) []metarPhenomenon { if len(raw) == 0 { return nil } out := make([]metarPhenomenon, 0, len(raw)) for _, m := range raw { b, err := json.Marshal(m) if err != nil { continue } var p metarPhenomenon if err := json.Unmarshal(b, &p); err != nil { continue } p.Weather = strings.ToLower(strings.TrimSpace(p.Weather)) p.RawString = strings.TrimSpace(p.RawString) out = append(out, p) } return out } func containsWeather(phenomena []metarPhenomenon, weather string) bool { weather = strings.ToLower(strings.TrimSpace(weather)) for _, p := range phenomena { if p.Weather == weather { return true } } return false }