Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

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}