feat: integrate restcountries api

This commit is contained in:
2026-02-08 20:40:18 +00:00
parent 8fc57d74bb
commit 3a18041c6f
2 changed files with 76 additions and 0 deletions
+57
View File
@@ -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
}
+19
View File
@@ -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" ]
}