func (c *wwoConfig) Fetch(loc string, numdays int) iface.Data { var params []string var resp wwoResponse var ret iface.Data coordChan := make(chan *iface.LatLon) if len(c.apiKey) == 0 { log.Fatal("No API key specified. Setup instructions are in the README.") } params = append(params, "key="+c.apiKey) if len(loc) > 0 { params = append(params, "q="+url.QueryEscape(loc)) } params = append(params, "format=json") params = append(params, "num_of_days="+strconv.Itoa(numdays)) params = append(params, "tp=3") go c.getCoordinatesFromAPI(params, coordChan) if c.language != "" { params = append(params, "lang="+c.language) } requri := wwoWuri + strings.Join(params, "&") res, err := http.Get(requri) if err != nil { log.Fatal("Unable to get weather data: ", err) } else if res.StatusCode != 200 { log.Fatal("Unable to get weather data: http status ", res.StatusCode) } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { log.Fatal(err) } if c.debug { log.Println("Weather request:", requri) log.Println("Weather response:", string(body)) } if c.language == "" { if err = json.Unmarshal(body, &resp); err != nil { log.Println(err) } } else { if err = wwoUnmarshalLang(body, &resp, c.language); err != nil { log.Println(err) } } if resp.Data.Req == nil || len(resp.Data.Req) < 1 { if resp.Data.Err != nil && len(resp.Data.Err) >= 1 { log.Fatal(resp.Data.Err[0].Msg) } log.Fatal("Malformed response.") } ret.Location = resp.Data.Req[0].Type + ": " + resp.Data.Req[0].Query ret.GeoLoc = <-coordChan if resp.Data.CurCond != nil && len(resp.Data.CurCond) > 0 { ret.Current = wwoParseCond(resp.Data.CurCond[0], time.Now()) } if resp.Data.Days != nil && numdays > 0 { for i, day := range resp.Data.Days { ret.Forecast = append(ret.Forecast, wwoParseDay(day, i)) } } return ret }