-
Notifications
You must be signed in to change notification settings - Fork 0
/
form.go
96 lines (77 loc) · 1.86 KB
/
form.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
package census
import (
"fmt"
"net/url"
"os"
"strings"
"time"
)
var censusApiKey = os.Getenv("CENSUS_API_KEY")
// Time is a lightweight struct for specifying
// a month and year
type Time struct {
Year int `json:"year"`
Month time.Month `json:"month"`
}
func (t Time) String() string {
if t.Month != 0 {
return fmt.Sprintf("%v-%v", t.Year, t.Month)
}
return fmt.Sprint(t.Year)
}
type Form struct {
Key string `json:"key"`
// What fields to get
Get []string `json:"get"`
// Predicates for the query. Slices are valid
Predicate map[string]interface{} `json:"predicates"`
// Geography fields
For int `json:"for"` // restrict at various levels
In int `json:"in"` // restrict at areas smaller than state level, after already using "for"
// Time Fields
OnTime *Time `json:"onTime"`
StartTime *Time `json:"startTime"`
EndTime *Time `json:"endTime"`
}
func (f Form) toValues() url.Values {
values := url.Values{
"get": {strings.Join(f.Get, ",")},
}
if f.Key != "" {
values.Add("key", f.Key)
} else if censusApiKey != "" {
values.Add("key", censusApiKey)
}
if f.In != 0 {
values.Add("in", fmt.Sprint(f.In))
}
if f.For != 0 {
values.Add("for", fmt.Sprint(f.For))
}
if f.OnTime != nil {
values.Add("time", f.OnTime.String())
} else {
var timeQuery string
if f.StartTime != nil && f.EndTime != nil {
timeQuery = fmt.Sprintf("from+%v+to+%v", f.StartTime, f.EndTime)
} else if f.StartTime != nil {
timeQuery = fmt.Sprintf("from+%v", f.StartTime)
} else if f.EndTime != nil {
timeQuery = fmt.Sprintf("to+%v", f.EndTime)
}
if timeQuery != "" {
values.Add("time", timeQuery)
}
}
for field, predicate := range f.Predicate {
switch p := predicate.(type) {
case []interface{}:
for _, condition := range p {
values.Add(field, fmt.Sprint(condition))
}
default:
values.Add(field, fmt.Sprint(p))
}
}
return values
}