209 lines
11 KiB
Go
209 lines
11 KiB
Go
// Package weatherdata defines normalized weather data collected from sources.
|
|
package weatherdata
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
)
|
|
|
|
type Bundle struct {
|
|
FetchedAt time.Time `json:"fetchedAt"`
|
|
Observation *Observation `json:"observation,omitempty"`
|
|
Current *Current `json:"current,omitempty"`
|
|
Hourly *ForecastRun `json:"hourly,omitempty"`
|
|
Narrative *ForecastRun `json:"narrative,omitempty"`
|
|
Alerts *AlertRun `json:"alerts,omitempty"`
|
|
Discussion *Discussion `json:"discussion,omitempty"`
|
|
Daily *ForecastRun `json:"daily,omitempty"`
|
|
WeatherStory *WeatherStory `json:"weatherStory,omitempty"`
|
|
SPCConvectiveOutlooks *ConvectiveOutlookRun `json:"spcConvectiveOutlooks,omitempty"`
|
|
Sources []Source `json:"sources"`
|
|
Warnings []SourceWarning `json:"warnings,omitempty"`
|
|
}
|
|
|
|
type Source struct {
|
|
Name string `json:"name"`
|
|
Endpoint string `json:"endpoint,omitempty"`
|
|
Query map[string]string `json:"query,omitempty"`
|
|
FetchedAt time.Time `json:"fetchedAt"`
|
|
IssuedAt *time.Time `json:"issuedAt,omitempty"`
|
|
UpdatedAt *time.Time `json:"updatedAt,omitempty"`
|
|
DataSHA256 string `json:"dataSha256,omitempty"`
|
|
Missing bool `json:"missing,omitempty"`
|
|
Warnings []SourceWarning `json:"warnings,omitempty"`
|
|
}
|
|
|
|
type SourceWarning struct {
|
|
Source string `json:"source" yaml:"source"`
|
|
Code string `json:"code" yaml:"code"`
|
|
Severity string `json:"severity" yaml:"severity"`
|
|
Message string `json:"message" yaml:"message"`
|
|
Endpoint string `json:"endpoint,omitempty" yaml:"endpoint,omitempty"`
|
|
CompletenessImpact string `json:"completenessImpact,omitempty" yaml:"completeness_impact,omitempty"`
|
|
}
|
|
|
|
type Observation struct {
|
|
StationID string `json:"stationId,omitempty"`
|
|
StationName string `json:"stationName,omitempty"`
|
|
Timestamp time.Time `json:"timestamp"`
|
|
ConditionCode *int `json:"conditionCode,omitempty"`
|
|
IsDay *bool `json:"isDay,omitempty"`
|
|
TextDescription string `json:"textDescription,omitempty"`
|
|
TemperatureC *float64 `json:"temperatureC,omitempty"`
|
|
TemperatureF *float64 `json:"temperatureF,omitempty"`
|
|
DewpointC *float64 `json:"dewpointC,omitempty"`
|
|
DewpointF *float64 `json:"dewpointF,omitempty"`
|
|
WindSpeedKmh *float64 `json:"windSpeedKmh,omitempty"`
|
|
WindSpeedMph *float64 `json:"windSpeedMph,omitempty"`
|
|
WindGustKmh *float64 `json:"windGustKmh,omitempty"`
|
|
WindGustMph *float64 `json:"windGustMph,omitempty"`
|
|
WindDirectionDegrees *float64 `json:"windDirectionDegrees,omitempty"`
|
|
BarometricPressurePa *float64 `json:"barometricPressurePa,omitempty"`
|
|
BarometricPressureInHg *float64 `json:"barometricPressureInHg,omitempty"`
|
|
VisibilityMeters *float64 `json:"visibilityMeters,omitempty"`
|
|
VisibilityMiles *float64 `json:"visibilityMiles,omitempty"`
|
|
RelativeHumidityPercent *float64 `json:"relativeHumidityPercent,omitempty"`
|
|
ApparentTemperatureC *float64 `json:"apparentTemperatureC,omitempty"`
|
|
ApparentTemperatureF *float64 `json:"apparentTemperatureF,omitempty"`
|
|
PresentWeather []json.RawMessage `json:"presentWeather,omitempty"`
|
|
}
|
|
|
|
type Current struct {
|
|
ConditionText string `json:"conditionText,omitempty"`
|
|
IsDay *bool `json:"isDay,omitempty"`
|
|
RelativeHumidityPercent *float64 `json:"relativeHumidityPercent,omitempty"`
|
|
WindDirectionDegrees *float64 `json:"windDirectionDegrees,omitempty"`
|
|
TemperatureC *float64 `json:"temperatureC,omitempty"`
|
|
TemperatureF *float64 `json:"temperatureF,omitempty"`
|
|
ApparentTemperatureC *float64 `json:"apparentTemperatureC,omitempty"`
|
|
ApparentTemperatureF *float64 `json:"apparentTemperatureF,omitempty"`
|
|
DewpointC *float64 `json:"dewpointC,omitempty"`
|
|
DewpointF *float64 `json:"dewpointF,omitempty"`
|
|
WindSpeedKmh *float64 `json:"windSpeedKmh,omitempty"`
|
|
WindSpeedMph *float64 `json:"windSpeedMph,omitempty"`
|
|
}
|
|
|
|
type ForecastRun struct {
|
|
LocationID string `json:"locationId,omitempty"`
|
|
LocationName string `json:"locationName,omitempty"`
|
|
IssuedAt time.Time `json:"issuedAt"`
|
|
UpdatedAt *time.Time `json:"updatedAt,omitempty"`
|
|
Product string `json:"product"`
|
|
Latitude *float64 `json:"latitude,omitempty"`
|
|
Longitude *float64 `json:"longitude,omitempty"`
|
|
ElevationMeters *float64 `json:"elevationMeters,omitempty"`
|
|
ElevationFeet *float64 `json:"elevationFeet,omitempty"`
|
|
Periods []ForecastPeriod `json:"periods"`
|
|
}
|
|
|
|
type ForecastPeriod struct {
|
|
StartTime time.Time `json:"startTime"`
|
|
EndTime time.Time `json:"endTime"`
|
|
Name string `json:"name,omitempty"`
|
|
IsDay *bool `json:"isDay,omitempty"`
|
|
ConditionCode *int `json:"conditionCode,omitempty"`
|
|
TextDescription string `json:"textDescription,omitempty"`
|
|
TemperatureC *float64 `json:"temperatureC,omitempty"`
|
|
TemperatureF *float64 `json:"temperatureF,omitempty"`
|
|
TemperatureCMin *float64 `json:"temperatureCMin,omitempty"`
|
|
TemperatureFMin *float64 `json:"temperatureFMin,omitempty"`
|
|
TemperatureCMax *float64 `json:"temperatureCMax,omitempty"`
|
|
TemperatureFMax *float64 `json:"temperatureFMax,omitempty"`
|
|
DewpointC *float64 `json:"dewpointC,omitempty"`
|
|
DewpointF *float64 `json:"dewpointF,omitempty"`
|
|
WindSpeedKmh *float64 `json:"windSpeedKmh,omitempty"`
|
|
WindSpeedMph *float64 `json:"windSpeedMph,omitempty"`
|
|
WindGustKmh *float64 `json:"windGustKmh,omitempty"`
|
|
WindGustMph *float64 `json:"windGustMph,omitempty"`
|
|
WindDirectionDegrees *float64 `json:"windDirectionDegrees,omitempty"`
|
|
BarometricPressurePa *float64 `json:"barometricPressurePa,omitempty"`
|
|
BarometricPressureInHg *float64 `json:"barometricPressureInHg,omitempty"`
|
|
VisibilityMeters *float64 `json:"visibilityMeters,omitempty"`
|
|
VisibilityMiles *float64 `json:"visibilityMiles,omitempty"`
|
|
ApparentTemperatureC *float64 `json:"apparentTemperatureC,omitempty"`
|
|
ApparentTemperatureF *float64 `json:"apparentTemperatureF,omitempty"`
|
|
CloudCoverPercent *float64 `json:"cloudCoverPercent,omitempty"`
|
|
ProbabilityOfPrecipitationPercent *float64 `json:"probabilityOfPrecipitationPercent,omitempty"`
|
|
PrecipitationAmountMm *float64 `json:"precipitationAmountMm,omitempty"`
|
|
PrecipitationAmountIn *float64 `json:"precipitationAmountIn,omitempty"`
|
|
SnowfallDepthMM *float64 `json:"snowfallDepthMM,omitempty"`
|
|
SnowfallDepthIn *float64 `json:"snowfallDepthIn,omitempty"`
|
|
UVIndex *float64 `json:"uvIndex,omitempty"`
|
|
RelativeHumidityPercent *float64 `json:"relativeHumidityPercent,omitempty"`
|
|
}
|
|
|
|
type AlertRun struct {
|
|
AsOf *time.Time `json:"asOf,omitempty"`
|
|
Alerts []json.RawMessage `json:"alerts,omitempty"`
|
|
Raw json.RawMessage `json:"raw,omitempty"`
|
|
}
|
|
|
|
type Discussion struct {
|
|
OfficeID string `json:"officeId,omitempty"`
|
|
OfficeName string `json:"officeName,omitempty"`
|
|
Product string `json:"product"`
|
|
IssuedAt time.Time `json:"issuedAt"`
|
|
UpdatedAt *time.Time `json:"updatedAt,omitempty"`
|
|
KeyMessages []string `json:"keyMessages,omitempty"`
|
|
ShortTerm *DiscussionSection `json:"shortTerm,omitempty"`
|
|
LongTerm *DiscussionSection `json:"longTerm,omitempty"`
|
|
}
|
|
|
|
type DiscussionSection struct {
|
|
Qualifier string `json:"qualifier,omitempty"`
|
|
Text string `json:"text,omitempty"`
|
|
IssuedAt *time.Time `json:"issuedAt,omitempty"`
|
|
}
|
|
|
|
type WeatherStory struct {
|
|
OfficeID string `json:"officeId,omitempty"`
|
|
StartTime time.Time `json:"startTime"`
|
|
EndTime time.Time `json:"endTime"`
|
|
UpdatedAt *time.Time `json:"updatedAt,omitempty"`
|
|
Title string `json:"title,omitempty"`
|
|
Description string `json:"description,omitempty"`
|
|
AltText string `json:"altText,omitempty"`
|
|
Priority bool `json:"priority"`
|
|
Order int `json:"order"`
|
|
DownloadURL string `json:"downloadUrl,omitempty"`
|
|
}
|
|
|
|
type ConvectiveOutlookRun struct {
|
|
LocationID string `json:"locationId,omitempty"`
|
|
LocationName string `json:"locationName,omitempty"`
|
|
AsOf *time.Time `json:"asOf,omitempty"`
|
|
IssuedAt *time.Time `json:"issuedAt,omitempty"`
|
|
UpdatedAt *time.Time `json:"updatedAt,omitempty"`
|
|
Product string `json:"product,omitempty"`
|
|
Outlooks []ConvectiveOutlook `json:"outlooks,omitempty"`
|
|
Discussions []ConvectiveOutlookDiscussion `json:"discussions,omitempty"`
|
|
}
|
|
|
|
type ConvectiveOutlook struct {
|
|
ID string `json:"id,omitempty"`
|
|
Provider string `json:"provider,omitempty"`
|
|
Product string `json:"product,omitempty"`
|
|
Day int `json:"day,omitempty"`
|
|
OutlookType string `json:"outlookType,omitempty"`
|
|
Label string `json:"label,omitempty"`
|
|
LabelText string `json:"labelText,omitempty"`
|
|
Forecaster string `json:"forecaster,omitempty"`
|
|
SeverityRank *int `json:"severityRank,omitempty"`
|
|
ValidFrom time.Time `json:"validFrom"`
|
|
ValidTo time.Time `json:"validTo"`
|
|
IssuedAt *time.Time `json:"issuedAt,omitempty"`
|
|
ExpiresAt *time.Time `json:"expiresAt,omitempty"`
|
|
SourceURL string `json:"sourceUrl,omitempty"`
|
|
ImageURL string `json:"imageUrl,omitempty"`
|
|
ContainsLocation bool `json:"containsLocation"`
|
|
Geometry json.RawMessage `json:"geometry,omitempty"`
|
|
}
|
|
|
|
type ConvectiveOutlookDiscussion struct {
|
|
Day int `json:"day,omitempty"`
|
|
Headline string `json:"headline,omitempty"`
|
|
Summary string `json:"summary,omitempty"`
|
|
Discussion string `json:"discussion,omitempty"`
|
|
UpdatedAt *time.Time `json:"updatedAt,omitempty"`
|
|
}
|