forked from schachmat/wego
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathiface.go
180 lines (151 loc) · 3.91 KB
/
iface.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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
package iface
import (
"log"
"time"
)
type WeatherCode int
const (
CodeUnknown WeatherCode = iota
CodeCloudy
CodeFog
CodeHeavyRain
CodeHeavyShowers
CodeHeavySnow
CodeHeavySnowShowers
CodeLightRain
CodeLightShowers
CodeLightSleet
CodeLightSleetShowers
CodeLightSnow
CodeLightSnowShowers
CodePartlyCloudy
CodeSunny
CodeThunderyHeavyRain
CodeThunderyShowers
CodeThunderySnowShowers
CodeVeryCloudy
)
type Cond struct {
// Time is the time, where this weather condition applies.
Time time.Time
// Code is the general weather condition and must be one the WeatherCode
// constants.
Code WeatherCode
// Desc is a short string describing the condition. It should be just one
// sentence.
Desc string
// TempC is the temperature in degrees celsius.
TempC *float32
// FeelsLikeC is the felt temperature (with windchill effect e.g.) in
// degrees celsius.
FeelsLikeC *float32
// ChanceOfRainPercent is the probability of rain or snow. It must be in the
// range [0, 100].
ChanceOfRainPercent *int
// PrecipM is the precipitation amount in meters(!) per hour. Must be >= 0.
PrecipM *float32
// VisibleDistM is the visibility range in meters(!). It must be >= 0.
VisibleDistM *float32
// WindspeedKmph is the average wind speed in kilometers per hour. The value
// must be >= 0.
WindspeedKmph *float32
// WindGustKmph is the maximum temporary wind speed in kilometers per
// second. It should be > WindspeedKmph.
WindGustKmph *float32
// WinddirDegree is the direction the wind is blowing from on a clock
// oriented circle with 360 degrees. 0 means the wind is blowing from north,
// 90 means the wind is blowing from east, 180 means the wind is blowing
// from south and 270 means the wind is blowing from west. The value must be
// in the range [0, 359].
WinddirDegree *int
// Humidity is the *relative* humidity and must be in [0, 100].
Humidity *int
}
type Astro struct {
Moonrise time.Time
Moonset time.Time
Sunrise time.Time
Sunset time.Time
}
type Day struct {
// Date is the date of this Day.
Date time.Time
// Slots is a slice of conditions for different times of day. They should be
// ordered by the contained Time field.
Slots []Cond
// Astronomy contains planetary data.
Astronomy Astro
}
type LatLon struct {
Latitude float32
Longitude float32
}
type Data struct {
Current Cond
Forecast []Day
Location string
GeoLoc *LatLon
}
type UnitSystem int
const (
UnitsMetric UnitSystem = iota
UnitsImperial
UnitsSi
UnitsMetricMs
)
func (u UnitSystem) Temp(tempC float32) (res float32, unit string) {
if u == UnitsMetric || u == UnitsMetricMs {
return tempC, "°C"
} else if u == UnitsImperial {
return tempC*1.8 + 32, "°F"
} else if u == UnitsSi {
return tempC + 273.16, "K"
}
log.Fatalln("Unknown unit system:", u)
return
}
func (u UnitSystem) Speed(spdKmph float32) (res float32, unit string) {
if u == UnitsMetric {
return spdKmph, "km/h"
} else if u == UnitsImperial {
return spdKmph / 1.609, "mph"
} else if u == UnitsSi || u == UnitsMetricMs {
return spdKmph / 3.6, "m/s"
}
log.Fatalln("Unknown unit system:", u)
return
}
func (u UnitSystem) Distance(distM float32) (res float32, unit string) {
if u == UnitsMetric || u == UnitsSi || u == UnitsMetricMs {
if distM < 1 {
return distM * 1000, "mm"
} else if distM < 1000 {
return distM, "m"
} else {
return distM / 1000, "km"
}
} else if u == UnitsImperial {
res, unit = distM/0.0254, "in"
if res < 3*12 { // 1yd = 3ft, 1ft = 12in
return
} else if res < 8*10*22*36 { //1mi = 8fur, 1fur = 10ch, 1ch = 22yd
return res / 36, "yd"
} else {
return res / 8 / 10 / 22 / 36, "mi"
}
}
log.Fatalln("Unknown unit system:", u)
return
}
type Backend interface {
Setup()
Fetch(location string, numdays int) Data
}
type Frontend interface {
Setup()
Render(weather Data, unitSystem UnitSystem)
}
var (
AllBackends = make(map[string]Backend)
AllFrontends = make(map[string]Frontend)
)