-
Notifications
You must be signed in to change notification settings - Fork 0
/
sites.go
60 lines (51 loc) · 1.62 KB
/
sites.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package weather
import (
"encoding/xml"
"fmt"
"golang.org/x/net/html/charset"
"net/http"
"strings"
)
type SiteList struct {
Sites []Site `xml:"site"`
}
type Site struct {
Code string `xml:"code,attr"`
EnglishName string `xml:"nameEn"`
FrenchName string `xml:"nameFr"`
Province Province `xml:"provinceCode"`
}
const (
NewfoundLandAndLabrador Province = "NL"
PrinceEdwardIsland Province = "PEI"
NovaScotia Province = "NS"
NewBrunswick Province = "NB"
Quebec Province = "QC"
Ontario Province = "ON"
Manitoba Province = "MB"
Saskatchewan Province = "SK"
Alberta Province = "AB"
BritishColumbia Province = "BC"
Yukon Province = "YT"
NorthwestTerritories Province = "NT"
Nunavut Province = "NU"
)
const weatherUrlFormat = "https://dd.weather.gc.ca/citypage_weather/xml/{province}/{site}_{language}.xml"
func (s *Site) GetSiteData(language Language) (*SiteData, error) {
url := strings.NewReplacer("{province}", string(s.Province), "{site}", s.Code, "{language}", string(language)).Replace(weatherUrlFormat)
resp, err := http.Get(url)
if err != nil {
return nil, fmt.Errorf("failed to load city: %w", err)
}
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("failed to load city: server returned non-ok status code")
}
var data SiteData
decoder := xml.NewDecoder(resp.Body)
decoder.CharsetReader = charset.NewReaderLabel
err = decoder.Decode(&data)
if err != nil {
return nil, fmt.Errorf("failed to load city: %w", err)
}
return &data, nil
}