/
main.go
78 lines (67 loc) · 1.67 KB
/
main.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
package main
import (
"github.com/skyforce77/jobtracker/providers"
"github.com/gopherjs/gopherjs/js"
"net/http"
"reflect"
"strings"
)
func main() {
js.Module.Get("exports").Set("getProviders", getProviders)
generateConstructors()
httpFix()
}
func isNode() bool {
if process := js.Global.Get("process"); process != js.Undefined {
argv := process.Get("argv")
return strings.Contains(argv.String(), "node")
}
return false
}
func httpFix() {
if isNode() {
js.Global.Set("XMLHttpRequest", js.Global.Call("require", "xhr2"))
http.DefaultTransport = &http.XHRTransport{}
}
}
func convertProvider(p providers.Provider) *js.Object {
jsp := js.Global.Get("Object").New()
jsp.Set("retrieveJobs", func(fn func(interface{})) {
go p.RetrieveJobs(getCallback(fn))
})
return jsp
}
func getProviders() []*js.Object {
jsProviders := make([]*js.Object, 0)
for _, p := range providers.GetProviders() {
jsp := convertProvider(p)
jsProviders = append(jsProviders, jsp)
}
return jsProviders
}
func generateConstructors() {
for _, p := range providers.GetProviders() {
typ := reflect.TypeOf(p)
name := typ.String()[11:]
if name[0] == '_' {
name = name[1:]
}
name = "new" + strings.Title(name)
js.Module.Get("exports").Set(name, func() *js.Object {
return convertProvider(p)
})
}
}
func getCallback(fn func(interface{})) func(job *providers.Job) {
return func(job *providers.Job) {
jsJob := js.Global.Get("Object").New()
jsJob.Set("title", job.Title)
jsJob.Set("company", job.Company)
jsJob.Set("location", job.Location)
jsJob.Set("type", job.Type)
jsJob.Set("desc", job.Desc)
jsJob.Set("link", job.Link)
jsJob.Set("misc", job.Misc)
fn(jsJob)
}
}