render.gno
1.62 Kb · 64 lines
1package lotto
2
3import (
4 "net/url"
5 "strconv"
6)
7
8func Render(path string) string {
9 output := `# AKKADIA Lotto
10
11Look up owners and their quantities for a number.
12
13<gno-form path="number">
14 <gno-input name="number" placeholder="Enter a number" />
15</gno-form>
16
17`
18 u, err := url.Parse(path)
19 if err != nil {
20 return output + "Invalid URL\n"
21 }
22 query, err := url.ParseQuery(u.RawQuery)
23 if err != nil {
24 return output + "Invalid query\n"
25 }
26 switch u.Path {
27 case "":
28 return output
29 case "number":
30 raw := query.Get("number")
31 if raw == "" {
32 return output + "Number is required\n"
33 }
34 number, err := strconv.ParseUint(raw, 10, 64)
35 if err != nil {
36 return output + "Invalid number\n"
37 }
38 afterOwner := query.Get("afterOwner")
39 if afterOwner != "" && !address(afterOwner).IsValid() {
40 return output + "Invalid cursor address\n"
41 }
42 numberStr := strconv.FormatUint(number, 10)
43 page := ListOwnersByNumber(number, afterOwner, 20)
44 output += "## Number " + numberStr + "\n\n"
45 output += "[Home](./lotto:)\n\n"
46 if afterOwner != "" {
47 output += "[First page](./lotto:number?number=" + numberStr + ")\n\n"
48 }
49 if len(page) == 0 {
50 return output + "No owners on this page.\n"
51 }
52 output += "| Owner | Count |\n| --- | ---: |\n"
53 for _, item := range page {
54 // Owners are validated addresses and counts are formatted integers.
55 output += "| " + item["owner"] + " | " + item["count"] + " |\n"
56 }
57 if page[0]["nextOwner"] != "" {
58 output += "\n[Next](./lotto:number?number=" + numberStr + "&afterOwner=" + url.QueryEscape(page[0]["nextOwner"]) + ")\n"
59 }
60 return output
61 default:
62 return output + "Page not found\n"
63 }
64}