mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
Output from 'dep status': PROJECT CONSTRAINT VERSION REVISION LATEST PKGS USED cloud.google.com/go v0.23.0 v0.23.0 0fd7230 v0.23.0 1 github.com/briandowns/openweathermap ^0.11.0 0.11 1b87579 0.11 1 github.com/gdamore/encoding branch master branch master b23993c b23993c 1 github.com/gdamore/tcell ^1.0.0 v1.0.0 061d51a v1.0.0 2 github.com/go-test/deep ^1.0.1 v1.0.1 6592d9c v1.0.1 1 github.com/golang/protobuf v1.1.0 v1.1.0 b4deda0 v1.1.0 1 github.com/google/go-github branch master branch master 2ae5df7 2ae5df7 1 github.com/google/go-querystring branch master branch master 53e6ce1 53e6ce1 1 github.com/jessevdk/go-flags ^1.4.0 v1.4.0 c6ca198 v1.4.0 1 github.com/lucasb-eyer/go-colorful v1.0 v1.0 345fbb3 v1.0 1 github.com/mattn/go-runewidth v0.0.2 v0.0.2 9e777a8 v0.0.2 1 github.com/olebedev/config branch master branch master 9a10d05 9a10d05 1 github.com/radovskyb/watcher ^1.0.2 v1.0.2 6145e14 v1.0.2 1 github.com/rivo/tview branch master branch master 71ecf1f 71ecf1f 1 github.com/yfronto/newrelic branch master branch master f7fa0c6 f7fa0c6 1 golang.org/x/net branch master branch master 1e49130 1e49130 2 golang.org/x/oauth2 branch master branch master 1e0a3fa 1e0a3fa 5 golang.org/x/text v0.3.0 v0.3.0 f21a4df v0.3.0 5 google.golang.org/api branch master branch master 00e3bb8 00e3bb8 4 google.golang.org/appengine v1.0.0 v1.0.0 150dc57 v1.0.0 10 gopkg.in/yaml.v2 ^2.2.1 v2.2.1 5420a8b v2.2.1 1 See https://golang.github.io/dep/docs/daily-dep.html
152 lines
4.1 KiB
Go
152 lines
4.1 KiB
Go
// Copyright 2015 Brian J. Downs
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package openweathermap
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// ForecastSys area population
|
|
type ForecastSys struct {
|
|
Population int `json:"population"`
|
|
}
|
|
|
|
// Temperature holds returned termperate sure stats
|
|
type Temperature struct {
|
|
Day float64 `json:"day"`
|
|
Min float64 `json:"min"`
|
|
Max float64 `json:"max"`
|
|
Night float64 `json:"night"`
|
|
Eve float64 `json:"eve"`
|
|
Morn float64 `json:"morn"`
|
|
}
|
|
|
|
// City data for given location
|
|
type City struct {
|
|
ID int `json:"id"`
|
|
Name string `json:"name"`
|
|
Coord Coordinates `json:"coord"`
|
|
Country string `json:"country"`
|
|
Population int `json:"population"`
|
|
Sys ForecastSys `json:"sys"`
|
|
}
|
|
|
|
type ForecastWeather interface {
|
|
DailyByName(location string, days int) error
|
|
DailyByCoordinates(location *Coordinates, days int) error
|
|
DailyByID(id, days int) error
|
|
}
|
|
|
|
// json served by OWM API can take different forms, so all of them must be matched
|
|
// by corresponding data type and unmarshall method
|
|
type ForecastWeatherJson interface {
|
|
Decode(r io.Reader) error
|
|
}
|
|
|
|
type ForecastWeatherData struct {
|
|
Unit string
|
|
Lang string
|
|
Key string
|
|
baseURL string
|
|
*Settings
|
|
ForecastWeatherJson
|
|
}
|
|
|
|
// NewForecast returns a new HistoricalWeatherData pointer with
|
|
// the supplied arguments.
|
|
func NewForecast(forecastType, unit, lang, key string, options ...Option) (*ForecastWeatherData, error) {
|
|
unitChoice := strings.ToUpper(unit)
|
|
langChoice := strings.ToUpper(lang)
|
|
|
|
if forecastType != "16" && forecastType != "5" {
|
|
return nil, errForecastUnavailable
|
|
}
|
|
|
|
if !ValidDataUnit(unitChoice) {
|
|
return nil, errUnitUnavailable
|
|
}
|
|
|
|
if !ValidLangCode(langChoice) {
|
|
return nil, errLangUnavailable
|
|
}
|
|
|
|
settings := NewSettings()
|
|
if err := setOptions(settings, options); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var err error
|
|
k, err := setKey(key)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
forecastData := ForecastWeatherData{
|
|
Unit: DataUnits[unitChoice],
|
|
Lang: langChoice,
|
|
Key: k,
|
|
Settings: settings,
|
|
}
|
|
|
|
if forecastType == "16" {
|
|
forecastData.baseURL = forecast16Base
|
|
forecastData.ForecastWeatherJson = &Forecast16WeatherData{}
|
|
} else {
|
|
forecastData.baseURL = forecast5Base
|
|
forecastData.ForecastWeatherJson = &Forecast5WeatherData{}
|
|
}
|
|
|
|
return &forecastData, nil
|
|
}
|
|
|
|
// DailyByName will provide a forecast for the location given for the
|
|
// number of days given.
|
|
func (f *ForecastWeatherData) DailyByName(location string, days int) error {
|
|
response, err := f.client.Get(fmt.Sprintf(f.baseURL, f.Key, fmt.Sprintf("%s=%s", "q", url.QueryEscape(location)), f.Unit, f.Lang, days))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer response.Body.Close()
|
|
|
|
return f.ForecastWeatherJson.Decode(response.Body)
|
|
}
|
|
|
|
// DailyByCoordinates will provide a forecast for the coordinates ID give
|
|
// for the number of days given.
|
|
func (f *ForecastWeatherData) DailyByCoordinates(location *Coordinates, days int) error {
|
|
response, err := f.client.Get(fmt.Sprintf(f.baseURL, f.Key, fmt.Sprintf("lat=%f&lon=%f", location.Latitude, location.Longitude), f.Unit, f.Lang, days))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer response.Body.Close()
|
|
|
|
return f.ForecastWeatherJson.Decode(response.Body)
|
|
}
|
|
|
|
// DailyByID will provide a forecast for the location ID give for the
|
|
// number of days given.
|
|
func (f *ForecastWeatherData) DailyByID(id, days int) error {
|
|
response, err := f.client.Get(fmt.Sprintf(f.baseURL, f.Key, fmt.Sprintf("%s=%s", "id", strconv.Itoa(id)), f.Unit, f.Lang, days))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer response.Body.Close()
|
|
|
|
return f.ForecastWeatherJson.Decode(response.Body)
|
|
}
|