From aef989c95180dd7d9c269a44ca1469134372488a Mon Sep 17 00:00:00 2001 From: Johan Brandhorst Date: Tue, 14 Apr 2020 11:10:50 +0100 Subject: [PATCH] Update vugu to 0.2.3 --- Makefile | 2 +- go.mod | 4 +- go.sum | 40 ++++++---- vugu/index.html | 4 +- vugu/main.go | 27 ------- vugu/main_wasm.go | 45 +++++++++++ vugu/root.go | 172 ------------------------------------------ vugu/root.vugu | 96 +++++++++++++----------- vugu/root_vgen.go | 186 ++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 313 insertions(+), 263 deletions(-) delete mode 100644 vugu/main.go create mode 100644 vugu/main_wasm.go delete mode 100644 vugu/root.go create mode 100644 vugu/root_vgen.go diff --git a/Makefile b/Makefile index c143366..157cbd3 100644 --- a/Makefile +++ b/Makefile @@ -59,7 +59,7 @@ ebiten: clean .PHONY: vugu vugu: clean go install github.com/vugu/vugu/cmd/vugugen - vugugen --skip-go-mod --skip-main ./vugu/ + vugugen --skip-go-mod ./vugu/ GOOS=js GOARCH=wasm go build -o ./html/main.wasm ./vugu/ cp ./vugu/index.html ./html/ cp $$(go env GOROOT)/misc/wasm/wasm_exec.js ./html/wasm_exec.js diff --git a/go.mod b/go.mod index 19cb9a0..4d6bd4a 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/microcosm-cc/bluemonday v1.0.2 github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/slimsag/blackfriday v2.0.0+incompatible - github.com/vugu/vugu v0.1.0 + github.com/vugu/vjson v0.0.0-20191111004939-722507e863cb + github.com/vugu/vugu v0.2.3 golang.org/x/image v0.0.0-20190618124811-92942e4437e2 - golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 // indirect ) diff --git a/go.sum b/go.sum index 1bd041a..b20e63f 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,16 @@ github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/chromedp/cdproto v0.0.0-20191009033829-c22f49c9ff0a/go.mod h1:PfAWWKJqjlGFYJEidUM6aVIWPr0EpobeyVWEEmplX7g= +github.com/chromedp/chromedp v0.5.1/go.mod h1:3NMfuKTrKNr8PWEvHzdzZ57PK4jm9zW1C5nKiaWdxcM= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-gl/glfw v0.0.0-20181213070059-819e8ce5125f h1:7MsFMbSn8Lcw0blK4+NEOf8DuHoOBDhJsHz04yh13pM= github.com/go-gl/glfw v0.0.0-20181213070059-819e8ce5125f/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gofrs/flock v0.7.0 h1:pGFUjl501gafK9HBt1VGL1KCOd/YhIooID+xgyJCf3g= github.com/gofrs/flock v0.7.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= @@ -34,11 +37,13 @@ github.com/jfreymuth/oggvorbis v1.0.0 h1:aOpiihGrFLXpsh2osOlEvTcg5/aluzGQeC7m3uY github.com/jfreymuth/oggvorbis v1.0.0/go.mod h1:abe6F9QRjuU9l+2jek3gj46lu40N4qlYxh2grqkLEDM= github.com/jfreymuth/vorbis v1.0.0 h1:SmDf783s82lIjGZi8EGUUaS7YxPHgRj4ZXW/h7rUi7U= github.com/jfreymuth/vorbis v1.0.0/go.mod h1:8zy3lUAm9K/rJJk223RKy6vjCZTWC61NA2QD06bfOE0= +github.com/knq/sysutil v0.0.0-20191005231841-15668db23d08/go.mod h1:dFWs1zEqDjFtnBXsd1vPOZaLsESovai349994nHx3e0= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -47,13 +52,19 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5I github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/slimsag/blackfriday v2.0.0+incompatible h1:3mjnT4p/+Ow8j8/T6H01S5pxXNPhVuOBzxmAbsszxi4= github.com/slimsag/blackfriday v2.0.0+incompatible/go.mod h1:K2UwInbJ1ywJkRQ2IMfjP071c3KZu7FiOn2NW97ckKk= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/vugu/vugu v0.1.0 h1:gJtz7jza90ZUKgLb1mu0Ql5x/wDV5pJxiqW7CPV+BJU= -github.com/vugu/vugu v0.1.0/go.mod h1:XcDIa6J18Rk/c56X88PTzawJTS2pSAGdTN6u5RE1ZWc= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/vugu/html v0.0.0-20190914200101-c62dc20b8289 h1:w3hfLuU5tKlcf+hhfmx6UZ5IC1h5M69dL9/6uugfLj8= +github.com/vugu/html v0.0.0-20190914200101-c62dc20b8289/go.mod h1:Y3pLGz8dZUSrB9SARXqFmtW8RNs4HIGAr0+JaWL31Vg= +github.com/vugu/vjson v0.0.0-20191111004939-722507e863cb h1:svqBUd2ETVrsM31o/toxvK1WeVMan3vCgrpecE5vMlA= +github.com/vugu/vjson v0.0.0-20191111004939-722507e863cb/go.mod h1:z7mAqSUjRDMQ09NIO18jG2llXMHLnUHlZ3/8MEMyBPA= +github.com/vugu/vugu v0.2.3 h1:tO0LG4YrIr6hpu+hgf/ccaMMjg3atvlVO+gq5m/2glw= +github.com/vugu/vugu v0.2.3/go.mod h1:RFwOrlJHEkdZvrFcde4d6c0/7SqlRA8E4l2yz1Rs8xM= +github.com/vugu/xxhash v0.0.0-20191111030615-ed24d0179019 h1:8NGiD5gWbVGObr+lnqcbM2rcOQBO6mr+m19BIblCdho= +github.com/vugu/xxhash v0.0.0-20191111030615-ed24d0179019/go.mod h1:PrBK6+LJXwb+3EnJTHo43Uh4FhjFFwvN4jKk4Zc5zZ8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/exp v0.0.0-20180710024300-14dda7b62fcd h1:nLIcFw7GiqKXUS7HiChg6OAYWgASB2H97dZKd1GhDSs= golang.org/x/exp v0.0.0-20180710024300-14dda7b62fcd/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -66,18 +77,19 @@ golang.org/x/mobile v0.0.0-20180806140643-507816974b79/go.mod h1:z+o9i4GpDbdi3rU golang.org/x/mobile v0.0.0-20190127143845-a42111704963 h1:2HSxAhImj2OpXsNjXSqfnv1xtqeCpDjwPB3o1DnQqKM= golang.org/x/mobile v0.0.0-20190127143845-a42111704963/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190328230028-74de082e2cca h1:hyA6yiAgbUwuWqtscNvWAI7U1CtlaD1KilQ6iudt1aI= -golang.org/x/net v0.0.0-20190328230028-74de082e2cca/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2 h1:4dVFTC832rPn4pomLSz1vA+are2+dU19w1H8OngV7nc= +golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190203050204-7ae0202eb74c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 h1:LepdCS8Gf/MVejFIt8lsiexZATdoGVyp5bcyS+rYoUI= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be h1:QAcqgptGM8IQBC9K/RC4o+O9YmqEm0diQn9QmZw/0mU= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20190202235157-7414d4c1f71c/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190407030857-0fdf0c73855b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vugu/index.html b/vugu/index.html index 24e11cc..2c3c18f 100644 --- a/vugu/index.html +++ b/vugu/index.html @@ -6,7 +6,7 @@ -
+
@@ -24,7 +24,7 @@ go.run(result.instance); }); } else { - document.getElementById("target").innerHTML = 'This application requires WebAssembly support. Please upgrade your browser.'; + document.getElementById("vugu_mount_point").innerHTML = 'This application requires WebAssembly support. Please upgrade your browser.'; } diff --git a/vugu/main.go b/vugu/main.go deleted file mode 100644 index a90b115..0000000 --- a/vugu/main.go +++ /dev/null @@ -1,27 +0,0 @@ -// +build js,wasm - -package main - -import ( - "log" - "os" - - "github.com/vugu/vugu" -) - -func main() { - rootInst, err := vugu.New(&Root{}, nil) - if err != nil { - log.Fatal(err) - } - - env := vugu.NewJSEnv("#target", rootInst, vugu.RegisteredComponentTypes()) - env.DebugWriter = os.Stdout - - for ok := true; ok; ok = env.EventWait() { - err = env.Render() - if err != nil { - log.Fatal(err) - } - } -} diff --git a/vugu/main_wasm.go b/vugu/main_wasm.go new file mode 100644 index 0000000..89cc82c --- /dev/null +++ b/vugu/main_wasm.go @@ -0,0 +1,45 @@ +// +build wasm + +package main + +import ( + "fmt" + + "flag" + + "github.com/vugu/vugu" + "github.com/vugu/vugu/domrender" +) + +func main() { + + mountPoint := flag.String("mount-point", "#vugu_mount_point", "The query selector for the mount point for the root component, if it is not a full HTML component") + flag.Parse() + + fmt.Printf("Entering main(), -mount-point=%q\n", *mountPoint) + defer fmt.Printf("Exiting main()\n") + + buildEnv, err := vugu.NewBuildEnv() + if err != nil { + panic(err) + } + + renderer, err := domrender.New(*mountPoint) + if err != nil { + panic(err) + } + defer renderer.Release() + + rootBuilder := &Root{} + + for ok := true; ok; ok = renderer.EventWait() { + + buildResults := buildEnv.RunBuild(rootBuilder) + + err = renderer.Render(buildResults) + if err != nil { + panic(err) + } + } + +} diff --git a/vugu/root.go b/vugu/root.go deleted file mode 100644 index df46632..0000000 --- a/vugu/root.go +++ /dev/null @@ -1,172 +0,0 @@ -package main - -// DO NOT EDIT: This file was generated by vugu. Please regenerate instead of editing or add additional code in a separate file. - -import "fmt" -import "reflect" -import "github.com/vugu/vugu" - -import "encoding/json" -import "net/http" -import "log" - -type RootData struct { - bpi bpi - isLoading bool -} - -type bpi struct { - Time struct { - Updated string `json:"updated"` - } `json:"time"` - BPI map[string]struct { - Code string `json:"code"` - Symbol string `json:"symbol"` - RateFloat float64 `json:"rate_float"` - } `json:"bpi"` -} - -func (data *RootData) HandleClick(event *vugu.DOMEvent) { - data.bpi = bpi{} - - go func(ee vugu.EventEnv) { - ee.Lock() - data.isLoading = true - ee.UnlockRender() - - res, err := http.Get("https://api.coindesk.com/v1/bpi/currentprice.json") - if err != nil { - log.Printf("Error fetch()ing: %v", err) - return - } - defer res.Body.Close() - - var newb bpi - err = json.NewDecoder(res.Body).Decode(&newb) - if err != nil { - log.Printf("Error JSON decoding: %v", err) - return - } - - ee.Lock() - defer ee.UnlockRender() - data.bpi = newb - data.isLoading = false - }(event.EventEnv()) -} - -var _ vugu.ComponentType = (*Root)(nil) - -func (comp *Root) BuildVDOM(dataI interface{}) (vdom *vugu.VGNode, css *vugu.VGNode, reterr error) { - data := dataI.(*RootData) - _ = data - _ = fmt.Sprint - _ = reflect.Value{} - event := vugu.DOMEventStub - _ = event - var n *vugu.VGNode - n = &vugu.VGNode{Type: vugu.VGNodeType(3), Data: "div", DataAtom: vugu.VGAtom(92931), Namespace: "", Attr: []vugu.VGAttribute{vugu.VGAttribute{Namespace: "", Key: "class", Val: "demo-comp"}}} - vdom = n - { - parent := n - n = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n\t", DataAtom: vugu.VGAtom(0), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - if data.isLoading { - n = &vugu.VGNode{Type: vugu.VGNodeType(3), Data: "div", DataAtom: vugu.VGAtom(92931), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - { - parent := n - n = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "Loading...", DataAtom: vugu.VGAtom(0), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - } - } - n = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n\t", DataAtom: vugu.VGAtom(0), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - if len(data.bpi.BPI) > 0 { - n = &vugu.VGNode{Type: vugu.VGNodeType(3), Data: "div", DataAtom: vugu.VGAtom(92931), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - { - parent := n - n = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n\t\t", DataAtom: vugu.VGAtom(0), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - n = &vugu.VGNode{Type: vugu.VGNodeType(3), Data: "div", DataAtom: vugu.VGAtom(92931), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - { - parent := n - n = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "Updated: ", DataAtom: vugu.VGAtom(0), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - n = &vugu.VGNode{Type: vugu.VGNodeType(3), Data: "span", DataAtom: vugu.VGAtom(40708), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - n.InnerHTML = fmt.Sprint(data.bpi.Time.Updated) - } - n = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n\t\t", DataAtom: vugu.VGAtom(0), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - n = &vugu.VGNode{Type: vugu.VGNodeType(3), Data: "ul", DataAtom: vugu.VGAtom(42754), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - { - parent := n - n = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n\t\t\t", DataAtom: vugu.VGAtom(0), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - for key, value := range data.bpi.BPI { - _, _ = key, value - n = &vugu.VGNode{Type: vugu.VGNodeType(3), Data: "li", DataAtom: vugu.VGAtom(45570), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - { - parent := n - n = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n\t\t\t\t", DataAtom: vugu.VGAtom(0), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - n = &vugu.VGNode{Type: vugu.VGNodeType(3), Data: "span", DataAtom: vugu.VGAtom(40708), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - n.InnerHTML = fmt.Sprint(key) - n = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: " ", DataAtom: vugu.VGAtom(0), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - n = &vugu.VGNode{Type: vugu.VGNodeType(3), Data: "span", DataAtom: vugu.VGAtom(40708), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - n.InnerHTML = fmt.Sprint(fmt.Sprint(value.Symbol, value.RateFloat)) - n = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n\t\t\t", DataAtom: vugu.VGAtom(0), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - } - } - n = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n\t\t", DataAtom: vugu.VGAtom(0), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - } - n = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n\t", DataAtom: vugu.VGAtom(0), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - } - } - n = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n\t", DataAtom: vugu.VGAtom(0), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - n = &vugu.VGNode{Type: vugu.VGNodeType(3), Data: "button", DataAtom: vugu.VGAtom(102662), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - // @click = { data.HandleClick(event) } - { - var i_ interface{} = data - idat_ := reflect.ValueOf(&i_).Elem().InterfaceData() - var i2_ interface{} = data.HandleClick - i2dat_ := reflect.ValueOf(&i2_).Elem().InterfaceData() - n.SetDOMEventHandler("click", vugu.DOMEventHandler{ - ReceiverAndMethodHash: uint64(idat_[0]) ^ uint64(idat_[1]) ^ uint64(i2dat_[0]) ^ uint64(i2dat_[1]), - Method: reflect.ValueOf(data).MethodByName("HandleClick"), - Args: []interface{}{event}, - }) - } - if false { - // force compiler to check arguments for type safety - data.HandleClick(event) - } - { - parent := n - n = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "Fetch Bitcoin Price Index", DataAtom: vugu.VGAtom(0), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - } - n = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n", DataAtom: vugu.VGAtom(0), Namespace: "", Attr: []vugu.VGAttribute(nil)} - parent.AppendChild(n) - } - return -} - -type Root struct {} - -func (ct *Root) NewData(props vugu.Props) (interface{}, error) { return &RootData{}, nil } - -func init() { vugu.RegisterComponentType("root", &Root{}) } diff --git a/vugu/root.vugu b/vugu/root.vugu index 5c25dc4..9a10f56 100644 --- a/vugu/root.vugu +++ b/vugu/root.vugu @@ -1,14 +1,14 @@ -
-
Loading...
-
-
Updated:
-
    -
  • - -
  • -
-
- +
+
Loading...
+
+
Updated:
+
    +
  • + +
  • +
+
+
diff --git a/vugu/root_vgen.go b/vugu/root_vgen.go new file mode 100644 index 0000000..2628b34 --- /dev/null +++ b/vugu/root_vgen.go @@ -0,0 +1,186 @@ +package main + +// DO NOT EDIT: This file was generated by vugu. Please regenerate instead of editing or add additional code in a separate file. + +import "fmt" +import "reflect" +import "github.com/vugu/vjson" +import "github.com/vugu/vugu" +import js "github.com/vugu/vugu/js" + +import "encoding/json" +import "net/http" +import "log" + +type Root struct { + PriceData bpi `vugu:"data"` + IsLoading bool `vugu:"data"` +} + +type bpi struct { + Time struct { + Updated string `json:"updated"` + } `json:"time"` + BPI map[string]struct { + Code string `json:"code"` + Symbol string `json:"symbol"` + RateFloat float64 `json:"rate_float"` + } `json:"bpi"` +} + +func (c *Root) HandleClick(event *vugu.DOMEvent) { + + c.PriceData = bpi{} + + ee := event.EventEnv() + + go func() { + + ee.Lock() + c.IsLoading = true + ee.UnlockRender() + + res, err := http.Get("https://api.coindesk.com/v1/bpi/currentprice.json") + if err != nil { + log.Printf("Error fetch()ing: %v", err) + return + } + defer res.Body.Close() + + var newb bpi + err = json.NewDecoder(res.Body).Decode(&newb) + if err != nil { + log.Printf("Error JSON decoding: %v", err) + return + } + + ee.Lock() + defer ee.UnlockRender() + c.PriceData = newb + c.IsLoading = false + + }() +} + +func (c *Root) Build(vgin *vugu.BuildIn) (vgout *vugu.BuildOut) { + + vgout = &vugu.BuildOut{} + + var vgiterkey interface{} + _ = vgiterkey + var vgn *vugu.VGNode + vgn = &vugu.VGNode{Type: vugu.VGNodeType(3), Namespace: "", Data: "div", Attr: []vugu.VGAttribute{vugu.VGAttribute{Namespace: "", Key: "class", Val: "demo"}}} + vgout.Out = append(vgout.Out, vgn) // root for output + { + vgparent := vgn + _ = vgparent + vgn = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n "} + vgparent.AppendChild(vgn) + if c.IsLoading { + vgn = &vugu.VGNode{Type: vugu.VGNodeType(3), Namespace: "", Data: "div", Attr: []vugu.VGAttribute(nil)} + vgparent.AppendChild(vgn) + { + vgparent := vgn + _ = vgparent + vgn = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "Loading..."} + vgparent.AppendChild(vgn) + } + } + vgn = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n "} + vgparent.AppendChild(vgn) + if len(c.PriceData.BPI) > 0 { + vgn = &vugu.VGNode{Type: vugu.VGNodeType(3), Namespace: "", Data: "div", Attr: []vugu.VGAttribute(nil)} + vgparent.AppendChild(vgn) + { + vgparent := vgn + _ = vgparent + vgn = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n "} + vgparent.AppendChild(vgn) + vgn = &vugu.VGNode{Type: vugu.VGNodeType(3), Namespace: "", Data: "div", Attr: []vugu.VGAttribute(nil)} + vgparent.AppendChild(vgn) + { + vgparent := vgn + _ = vgparent + vgn = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "Updated: "} + vgparent.AppendChild(vgn) + vgn = &vugu.VGNode{Type: vugu.VGNodeType(3), Namespace: "", Data: "span", Attr: []vugu.VGAttribute(nil)} + vgparent.AppendChild(vgn) + { + vghtml := fmt.Sprint(c.PriceData.Time.Updated) + vgn.InnerHTML = &vghtml + } + } + vgn = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n "} + vgparent.AppendChild(vgn) + vgn = &vugu.VGNode{Type: vugu.VGNodeType(3), Namespace: "", Data: "ul", Attr: []vugu.VGAttribute(nil)} + vgparent.AppendChild(vgn) + { + vgparent := vgn + _ = vgparent + vgn = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n "} + vgparent.AppendChild(vgn) + for key, value := range c.PriceData.BPI { + var vgiterkey interface{} = key + _ = vgiterkey + key := key + _ = key + value := value + _ = value + vgn = &vugu.VGNode{Type: vugu.VGNodeType(3), Namespace: "", Data: "li", Attr: []vugu.VGAttribute(nil)} + vgparent.AppendChild(vgn) + { + vgparent := vgn + _ = vgparent + vgn = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n "} + vgparent.AppendChild(vgn) + vgn = &vugu.VGNode{Type: vugu.VGNodeType(3), Namespace: "", Data: "span", Attr: []vugu.VGAttribute(nil)} + vgparent.AppendChild(vgn) + { + vghtml := fmt.Sprint(key) + vgn.InnerHTML = &vghtml + } + vgn = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: " "} + vgparent.AppendChild(vgn) + vgn = &vugu.VGNode{Type: vugu.VGNodeType(3), Namespace: "", Data: "span", Attr: []vugu.VGAttribute(nil)} + vgparent.AppendChild(vgn) + { + vghtml := fmt.Sprint(fmt.Sprint(value.Symbol, value.RateFloat)) + vgn.InnerHTML = &vghtml + } + vgn = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n "} + vgparent.AppendChild(vgn) + } + } + vgn = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n "} + vgparent.AppendChild(vgn) + } + vgn = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n "} + vgparent.AppendChild(vgn) + } + } + vgn = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n "} + vgparent.AppendChild(vgn) + vgn = &vugu.VGNode{Type: vugu.VGNodeType(3), Namespace: "", Data: "button", Attr: []vugu.VGAttribute(nil)} + vgparent.AppendChild(vgn) + vgn.DOMEventHandlerSpecList = append(vgn.DOMEventHandlerSpecList, vugu.DOMEventHandlerSpec{ + EventType: "click", + Func: func(event *vugu.DOMEvent) { c.HandleClick(event) }, + // TODO: implement capture, etc. mostly need to decide syntax + }) + { + vgparent := vgn + _ = vgparent + vgn = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "Fetch Bitcoin Price Index"} + vgparent.AppendChild(vgn) + } + vgn = &vugu.VGNode{Type: vugu.VGNodeType(1), Data: "\n"} + vgparent.AppendChild(vgn) + } + return vgout +} + +// 'fix' unused imports +var _ fmt.Stringer +var _ reflect.Type +var _ vjson.RawMessage +var _ js.Value