mirror of https://github.com/chubin/wttr.in
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
1.3 KiB
78 lines
1.3 KiB
package location
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
|
|
"github.com/chubin/wttr.in/internal/types"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type Nominatim struct {
|
|
name string
|
|
url string
|
|
token string
|
|
typ string
|
|
}
|
|
|
|
type locationQuerier interface {
|
|
Query(*Nominatim, string) (*Location, error)
|
|
}
|
|
|
|
func NewNominatim(name, typ, url, token string) *Nominatim {
|
|
return &Nominatim{
|
|
name: name,
|
|
url: url,
|
|
token: token,
|
|
typ: typ,
|
|
}
|
|
}
|
|
|
|
func (n *Nominatim) Query(location string) (*Location, error) {
|
|
var data locationQuerier
|
|
|
|
switch n.typ {
|
|
case "iq":
|
|
data = &locationIQ{}
|
|
case "opencage":
|
|
data = &locationOpenCage{}
|
|
default:
|
|
return nil, fmt.Errorf("%s: %w", n.name, types.ErrUnknownLocationService)
|
|
}
|
|
|
|
return data.Query(n, location)
|
|
}
|
|
|
|
func makeQuery(url string, result interface{}) error {
|
|
var errResponse struct {
|
|
Error string
|
|
}
|
|
|
|
log.Debugln("nominatim:", url)
|
|
resp, err := http.Get(url)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = json.Unmarshal(body, &errResponse)
|
|
if err == nil && errResponse.Error != "" {
|
|
return fmt.Errorf("%w: %s", types.ErrUpstream, errResponse.Error)
|
|
}
|
|
|
|
log.Debugln("nominatim: response: ", string(body))
|
|
err = json.Unmarshal(body, &result)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|