52 lines
1.2 KiB
Go
52 lines
1.2 KiB
Go
// 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
|
|
}
|