From 7e50bc27cab438421c79f7a6e5ad29d5132ec1cc Mon Sep 17 00:00:00 2001 From: siddharth ravikumar Date: Thu, 16 Jun 2022 00:42:00 -0400 Subject: nws: add `GetAlerts` --- nws/nws.go | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ nws/nws_test.go | 8 +++++++ 2 files changed, 77 insertions(+) diff --git a/nws/nws.go b/nws/nws.go index c6940d0..a1fd4ef 100644 --- a/nws/nws.go +++ b/nws/nws.go @@ -8,6 +8,7 @@ import ( "encoding/json" "fmt" "io" + "net/url" "time" "ricketyspace.net/peach/cache" @@ -59,6 +60,21 @@ type Forecast struct { Properties ForecastProperties } +type FeatureProperties struct { + Event string + Severity string + Description string + Instruction string +} + +type Feature struct { + Properties FeatureProperties +} + +type FeatureCollection struct { + Features []Feature +} + type Error struct { Title string Type string @@ -76,11 +92,20 @@ type ForecastBundle struct { var pCache *cache.Cache var fCache *cache.Cache var fhCache *cache.Cache +var baseUrl *url.URL func init() { + var err error + pCache = cache.NewCache() fCache = cache.NewCache() fhCache = cache.NewCache() + + // Parse NWS base url. + baseUrl, err = url.Parse("https://api.weather.gov") + if err != nil { + panic(`url parse: nws base url: ` + err.Error()) + } } func (e Error) Error() string { @@ -231,6 +256,50 @@ func GetForecastHourly(point *Point) (*Forecast, error) { return forecast, nil } +// NWS active alerts endpoint. +func GetAlerts(lat, lng float32) (fc *FeatureCollection, err *Error) { + // Alerts endpoint. + u, uErr := baseUrl.Parse("/alerts/active") + if uErr != nil { + err = &Error{ + Title: "alerts url parsing failed", + Type: "url-parse-error", + Status: 500, + Detail: uErr.Error(), + } + return + } + + // Build query. + q := url.Values{} + q.Add("status", "actual") + q.Add("message_type", "alert") + q.Add("point", fmt.Sprintf("%.4f,%.4f", lat, lng)) + q.Add("urgency", "Immediate,Expected") + q.Add("certainty", "Observed,Likely,Possible") + u.RawQuery = q.Encode() + + // Hit it. + body, _, err := get(u.String()) + if err != nil { + return + } + + // Unmarshal. + fc = new(FeatureCollection) + jErr := json.Unmarshal(body, fc) + if jErr != nil { + err = &Error{ + Title: "feature collection decode failed", + Type: "json-decode-error", + Status: 500, + Detail: jErr.Error(), + } + return + } + return +} + // HTTP GET a NWS endpoint. func get(url string) ([]byte, time.Time, *Error) { // Default response expiration time diff --git a/nws/nws_test.go b/nws/nws_test.go index a92ed7e..21127e0 100644 --- a/nws/nws_test.go +++ b/nws/nws_test.go @@ -242,3 +242,11 @@ func TestNWSGetWrapper(t *testing.T) { return } } + +func TestAlerts(t *testing.T) { + _, err := GetAlerts(33.2938, -83.9674) + if err != nil { + t.Errorf("alerts: %v", err) + return + } +} -- cgit v1.2.3