feat: integrate restcountries api
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
package geodata
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func FetchLive() (TimezoneMap, error) {
|
||||
client := http.Client{Timeout: 10 * time.Second}
|
||||
|
||||
// from: https://restcountries.com
|
||||
url := "https://restcountries.com/v3.1/all?fields=name,population,timezones"
|
||||
|
||||
resp, err := client.Get(url)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to fetch country data")
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
return nil, fmt.Errorf("failed to fetch country data")
|
||||
}
|
||||
|
||||
var apidData []countryApiReponse
|
||||
if err := json.NewDecoder(resp.Body).Decode(&apidData); err != nil {
|
||||
return nil, fmt.Errorf("failed to fetch ")
|
||||
}
|
||||
|
||||
return buildTzMap(apidData), nil
|
||||
}
|
||||
|
||||
func buildTzMap(data []countryApiReponse) TimezoneMap {
|
||||
tzMap := make(TimezoneMap)
|
||||
|
||||
for _, countryRaw := range data {
|
||||
country := Country{
|
||||
Name: countryRaw.Name.Common,
|
||||
Population: countryRaw.Population,
|
||||
}
|
||||
|
||||
for _, rawTZ := range countryRaw.Timezones {
|
||||
rawTZ = strings.TrimPrefix(rawTZ, "UTC")
|
||||
rawTZ = strings.ReplaceAll(rawTZ, ":", "")
|
||||
|
||||
if rawTZ == "" {
|
||||
rawTZ = "+0000" // api quirk
|
||||
}
|
||||
|
||||
tzMap[rawTZ] = append(tzMap[rawTZ], country)
|
||||
}
|
||||
}
|
||||
|
||||
return tzMap
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package geodata
|
||||
|
||||
// Country info exposed to other packages
|
||||
type Country struct {
|
||||
Name string
|
||||
Population int64
|
||||
}
|
||||
|
||||
// Timezone to Country lookups
|
||||
type TimezoneMap map[string][]Country
|
||||
|
||||
// internal model for https://restcountries.com/v3.1/all?fields=name,population,timezones
|
||||
type countryApiReponse struct {
|
||||
Name struct {
|
||||
Common string `json:"common"` // it has other fields but I don't want them
|
||||
} `json:"name"`
|
||||
Population int64 `json:"population"`
|
||||
Timezones []string `json:"timezones"` // example: [ "UTC+00:00" ]
|
||||
}
|
||||
Reference in New Issue
Block a user