render.gno
2.42 Kb ยท 109 lines
1package impl
2
3import (
4 "std"
5 "strconv"
6 "strings"
7
8 "gno.land/p/demo/avl/pager"
9 "gno.land/p/demo/mux"
10 "gno.land/p/demo/ufmt"
11 "gno.land/r/gov/dao"
12)
13
14type render struct {
15 relativeRealmPath string
16 router *mux.Router
17 pssPager *pager.Pager
18}
19
20func NewRender(d *GovDAO) *render {
21 ren := &render{
22 pssPager: pager.NewPager(d.pss.Tree, 3, true),
23 }
24
25 r := mux.NewRouter()
26
27 r.HandleFunc("/", func(rw *mux.ResponseWriter, req *mux.Request) {
28 rw.Write(ren.renderActiveProposals(req.RawPath, d))
29 })
30
31 r.HandleFunc("", func(rw *mux.ResponseWriter, req *mux.Request) {
32 rw.Write(ren.renderActiveProposals(req.RawPath, d))
33 })
34
35 r.HandleFunc("{pid}", func(rw *mux.ResponseWriter, req *mux.Request) {
36 rw.Write(ren.renderProposal(req.GetVar("pid"), d))
37 })
38
39 r.HandleFunc("{pid}/votes", func(rw *mux.ResponseWriter, req *mux.Request) {
40 rw.Write(ren.renderVotesForProposal(req.GetVar("pid"), d))
41 })
42
43 ren.router = r
44
45 return ren
46}
47
48func (ren *render) Render(pkgPath string, path string) string {
49 relativePath, found := strings.CutPrefix(pkgPath, std.ChainDomain())
50 if !found {
51 panic(ufmt.Sprintf(
52 "realm package with unexpected name found: %v in chain domain %v",
53 pkgPath, std.ChainDomain()))
54 }
55 ren.relativeRealmPath = relativePath
56 return ren.router.Render(path)
57}
58
59func (ren *render) renderActiveProposals(url string, d *GovDAO) string {
60 out := "# Active Proposals:\n"
61
62 page, err := ren.pssPager.GetPageByPath(url)
63 if err != nil {
64 out += ufmt.Sprintf("Error getting selected page: %v", err.Error())
65 return out
66 }
67
68 for _, item := range page.Items {
69 out += ren.renderProposal(item.Key, d)
70 }
71
72 out += page.Picker("")
73
74 return out
75}
76
77func (ren *render) renderProposal(sPid string, d *GovDAO) string {
78 pid, err := strconv.Atoi(sPid)
79 if err != nil {
80 panic(err.Error())
81 }
82 ps := d.pss.GetStatus(dao.ProposalID(pid))
83
84 p := dao.MustGetProposal(cross, dao.ProposalID(pid))
85
86 out := ""
87 out += ufmt.Sprintf("## Proposal with id: %v", sPid)
88 out += StringifyProposal(p)
89 out += "\n\n"
90 out += ps.String()
91 out += ufmt.Sprintf("- [Go to votes list](%v:%v/votes).", ren.relativeRealmPath, sPid)
92 out += "\n\n"
93
94 return out
95}
96
97func (ren *render) renderVotesForProposal(sPid string, d *GovDAO) string {
98 pid, err := strconv.Atoi(sPid)
99 if err != nil {
100 panic(err.Error())
101 }
102 ps := d.pss.GetStatus(dao.ProposalID(pid))
103
104 out := ""
105 out += ufmt.Sprintf("## Voters for Proposal with id: %v\n\n", sPid)
106 out += StringifyVotes(ps)
107
108 return out
109}