Add SPC provider parsing helpers
This commit is contained in:
89
internal/providers/spc/product.go
Normal file
89
internal/providers/spc/product.go
Normal file
@@ -0,0 +1,89 @@
|
||||
package spc
|
||||
|
||||
import "fmt"
|
||||
|
||||
const (
|
||||
OutlookTypeCategorical = "categorical"
|
||||
OutlookTypeTornado = "tornado"
|
||||
OutlookTypeHail = "hail"
|
||||
OutlookTypeWind = "wind"
|
||||
)
|
||||
|
||||
// GeoJSONProduct describes one required SPC convective outlook GeoJSON product.
|
||||
type GeoJSONProduct struct {
|
||||
Key string
|
||||
Day int
|
||||
OutlookType string
|
||||
URL string
|
||||
}
|
||||
|
||||
// DiscussionProduct describes one required SPC convective outlook print page.
|
||||
type DiscussionProduct struct {
|
||||
Key string
|
||||
Day int
|
||||
URL string
|
||||
}
|
||||
|
||||
var geoJSONProducts = []GeoJSONProduct{
|
||||
{Key: "day1_categorical", Day: 1, OutlookType: OutlookTypeCategorical, URL: "https://www.spc.noaa.gov/products/outlook/day1otlk_cat.nolyr.geojson"},
|
||||
{Key: "day1_tornado", Day: 1, OutlookType: OutlookTypeTornado, URL: "https://www.spc.noaa.gov/products/outlook/day1otlk_torn.nolyr.geojson"},
|
||||
{Key: "day1_hail", Day: 1, OutlookType: OutlookTypeHail, URL: "https://www.spc.noaa.gov/products/outlook/day1otlk_hail.nolyr.geojson"},
|
||||
{Key: "day1_wind", Day: 1, OutlookType: OutlookTypeWind, URL: "https://www.spc.noaa.gov/products/outlook/day1otlk_wind.nolyr.geojson"},
|
||||
{Key: "day2_categorical", Day: 2, OutlookType: OutlookTypeCategorical, URL: "https://www.spc.noaa.gov/products/outlook/day2otlk_cat.nolyr.geojson"},
|
||||
{Key: "day2_tornado", Day: 2, OutlookType: OutlookTypeTornado, URL: "https://www.spc.noaa.gov/products/outlook/day2otlk_torn.nolyr.geojson"},
|
||||
{Key: "day2_hail", Day: 2, OutlookType: OutlookTypeHail, URL: "https://www.spc.noaa.gov/products/outlook/day2otlk_hail.nolyr.geojson"},
|
||||
{Key: "day2_wind", Day: 2, OutlookType: OutlookTypeWind, URL: "https://www.spc.noaa.gov/products/outlook/day2otlk_wind.nolyr.geojson"},
|
||||
{Key: "day3_categorical", Day: 3, OutlookType: OutlookTypeCategorical, URL: "https://www.spc.noaa.gov/products/outlook/day3otlk_cat.nolyr.geojson"},
|
||||
{Key: "day3_tornado", Day: 3, OutlookType: OutlookTypeTornado, URL: "https://www.spc.noaa.gov/products/outlook/day3otlk_torn.nolyr.geojson"},
|
||||
{Key: "day3_hail", Day: 3, OutlookType: OutlookTypeHail, URL: "https://www.spc.noaa.gov/products/outlook/day3otlk_hail.nolyr.geojson"},
|
||||
{Key: "day3_wind", Day: 3, OutlookType: OutlookTypeWind, URL: "https://www.spc.noaa.gov/products/outlook/day3otlk_wind.nolyr.geojson"},
|
||||
}
|
||||
|
||||
var discussionProducts = []DiscussionProduct{
|
||||
{Key: "day1", Day: 1, URL: "https://www.spc.noaa.gov/products/outlook/day1otlk_prt.html"},
|
||||
{Key: "day2", Day: 2, URL: "https://www.spc.noaa.gov/products/outlook/day2otlk_prt.html"},
|
||||
{Key: "day3", Day: 3, URL: "https://www.spc.noaa.gov/products/outlook/day3otlk_prt.html"},
|
||||
}
|
||||
|
||||
// GeoJSONProducts returns the required SPC convective outlook GeoJSON products
|
||||
// in stable day/type order.
|
||||
func GeoJSONProducts() []GeoJSONProduct {
|
||||
out := make([]GeoJSONProduct, len(geoJSONProducts))
|
||||
copy(out, geoJSONProducts)
|
||||
return out
|
||||
}
|
||||
|
||||
// DiscussionProducts returns the required SPC convective outlook print pages in
|
||||
// stable day order.
|
||||
func DiscussionProducts() []DiscussionProduct {
|
||||
out := make([]DiscussionProduct, len(discussionProducts))
|
||||
copy(out, discussionProducts)
|
||||
return out
|
||||
}
|
||||
|
||||
// GeoJSONProductByKey returns product metadata for a configured product key.
|
||||
func GeoJSONProductByKey(key string) (GeoJSONProduct, bool) {
|
||||
for _, product := range geoJSONProducts {
|
||||
if product.Key == key {
|
||||
return product, true
|
||||
}
|
||||
}
|
||||
return GeoJSONProduct{}, false
|
||||
}
|
||||
|
||||
// DiscussionProductByKey returns discussion metadata for a configured day key.
|
||||
func DiscussionProductByKey(key string) (DiscussionProduct, bool) {
|
||||
for _, product := range discussionProducts {
|
||||
if product.Key == key {
|
||||
return product, true
|
||||
}
|
||||
}
|
||||
return DiscussionProduct{}, false
|
||||
}
|
||||
|
||||
func validateProductDay(day int) error {
|
||||
if day < 1 || day > 3 {
|
||||
return fmt.Errorf("day must be 1, 2, or 3, got %d", day)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user