1
0
Fork 0

Add NWS daily forecast

main v0.20.0
Jordan Hotmann 2024-01-02 11:55:08 -07:00
parent 7e9647b1ae
commit b8a82b0050
No known key found for this signature in database
GPG Key ID: 01B504170C2A2EA3
2 changed files with 46 additions and 0 deletions

View File

@ -29,9 +29,15 @@ func New() *NwsClient {
func (c *NwsClient) CoordinatesToPoint(lat float64, lon float64) (Point, error) { func (c *NwsClient) CoordinatesToPoint(lat float64, lon float64) (Point, error) {
var p Point var p Point
_, err := c.restClient.R().SetResult(&p).Get(fmt.Sprintf("points/%f,%f", lat, lon)) _, err := c.restClient.R().SetResult(&p).Get(fmt.Sprintf("points/%f,%f", lat, lon))
p.Lat = lat
p.Lon = lon
return p, err return p, err
} }
func (p Point) GetWebURL() string {
return fmt.Sprintf("https://forecast.weather.gov/MapClick.php?lat=%f&lon=%f", p.Lat, p.Lon)
}
func (c *NwsClient) GetHourlyForecast(p Point) (HourlyProps, error) { func (c *NwsClient) GetHourlyForecast(p Point) (HourlyProps, error) {
var data struct { var data struct {
Properties HourlyProps `json:"properties"` Properties HourlyProps `json:"properties"`
@ -45,6 +51,19 @@ func (c *NwsClient) GetHourlyForecast(p Point) (HourlyProps, error) {
return data.Properties, nil return data.Properties, nil
} }
func (c *NwsClient) GetDailyForecast(p Point) (DailyProps, error) {
var data struct {
Properties DailyProps `json:"properties"`
}
_, err := util.CheckSuccess(c.restClient.R().SetResult(&data).
Get(removeBase(p.Properties.Forecast)))
if err != nil {
return DailyProps{}, nil
}
return data.Properties, nil
}
func (p HourlyProps) GetHighLow(hours int) (high int, low int) { func (p HourlyProps) GetHighLow(hours int) (high int, low int) {
if hours > len(p.Periods) { if hours > len(p.Periods) {
hours = len(p.Periods) hours = len(p.Periods)

View File

@ -23,6 +23,8 @@ type PointProps struct {
type Point struct { type Point struct {
ID string `json:"id"` ID string `json:"id"`
Properties PointProps `json:"properties"` Properties PointProps `json:"properties"`
Lat float64
Lon float64
} }
type HourlyPeriod struct { type HourlyPeriod struct {
@ -42,6 +44,31 @@ type HourlyProps struct {
Periods []HourlyPeriod `json:"periods"` Periods []HourlyPeriod `json:"periods"`
} }
type DailyPeriod struct {
Number int `json:"number,omitempty"`
Name string `json:"name,omitempty"`
StartTime string `json:"startTime,omitempty"`
EndTime string `json:"endTime,omitempty"`
IsDaytime bool `json:"isDaytime,omitempty"`
Temperature int `json:"temperature,omitempty"`
TemperatureUnit string `json:"temperatureUnit,omitempty"`
TemperatureTrend string `json:"temperatureTrend,omitempty"`
ProbabilityOfPrecipitation UnitValue[int] `json:"probabilityOfPrecipitation,omitempty"`
Dewpoint UnitValue[float64] `json:"dewpoint,omitempty"`
RelativeHumidity UnitValue[int] `json:"relativeHumidity,omitempty"`
WindSpeed string `json:"windSpeed,omitempty"`
WindDirection string `json:"windDirection,omitempty"`
Icon string `json:"icon,omitempty"`
ShortForecast string `json:"shortForecast,omitempty"`
DetailedForecast string `json:"detailedForecast,omitempty"`
}
type DailyProps struct {
Updated time.Time `json:"updated"`
Units string `json:"units"`
Periods []DailyPeriod `json:"periods"`
}
type Observations struct { type Observations struct {
Timestamp time.Time `json:"timestamp"` Timestamp time.Time `json:"timestamp"`
Temperature UnitValue[float64] `json:"temperature"` Temperature UnitValue[float64] `json:"temperature"`