package main // TODO: allow free-text lookups of place names, rather than ids // TODO: decode weather type number // TODO: split out met office specific stuff to separate module // TODO: add other weather providers import ( "encoding/json" "flag" "fmt" "io/ioutil" "log" "net/http" ) const defid = "310118" var wkey = map[string]string{ "f": "Feels Like Temperature", "h": "Humidity", "p": "Pressure", "t": "Temperature", "v": "Visibility", "wg": "Wind Gust", "ws": "Wind Speed", "pp": "Precipitaton Probability", "uv": "Max UV Index", "wd": "Wind Direction", "wt": "Weather Type", "AQIndex": "Air Quality", } type Response struct { BestFcst struct { Forecast struct { Location struct { Days []Day `json:"Day"` } } } } type Day struct { Date string `json:"@date"` DayValues struct { WeatherParameters WeatherParams } NightValues struct { WeatherParameters WeatherParams } TimeSteps struct { TimeStep []struct { Time string `json:"@time"` WeatherParameters WeatherParams } } } type WeatherParams struct { AQIndex float64 F float64 H float64 P float64 PP float64 UV float64 T float64 V float64 WD string WG float64 WS float64 WT float64 } func main() { var r Response var id string flag.Parse() if flag.NArg() > 0 { id = flag.Arg(0) } else { id = defid } client := &http.Client{Transport: &http.Transport{}} resp, err := client.Get("https://www.metoffice.gov.uk/public/data/PWSCache/BestForecast/Forecast/" + id + ".json?concise=true") if err != nil { log.Fatal(err) } defer resp.Body.Close() b, err := ioutil.ReadAll(resp.Body) err = json.Unmarshal(b, &r) if err != nil { log.Fatal(err) } for _, d := range r.BestFcst.Forecast.Location.Days { fmt.Printf("-----------------------------\n") fmt.Printf("Date: %v\n", d.Date) fmt.Printf("\nDay weather:\n") prettyWeather(d.DayValues.WeatherParameters) fmt.Printf("\nNight weather:\n") prettyWeather(d.NightValues.WeatherParameters) fmt.Printf("\nTime steps:\n") for _, t := range d.TimeSteps.TimeStep { fmt.Printf("\nTime: %s\n", t.Time) prettyWeather(t.WeatherParameters) } } } func prettyWeather(w WeatherParams) { // TODO: Print weather nicely fmt.Printf("%+v\n", w) }